参考文献链接:代码随想录
本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。
452. 用最少数量的箭引爆气球
解题思路
这道题目的意思是比较好理解的,只要我们尽可能的去一箭多雕就能推出全局最优最少的箭。那么如何去最少的箭?
其实这道题目也有点像昨天做的,两个坐标一起判断太困难了。我们先按左边排序,这样基本上相邻的都是可能会重合的。
其次我们去判断i的左边界和i-1的右边界是否重合,重合就不用射箭,不重合就得箭++。当判断该箭和前一个箭重合时,不能就此结束,还得判断是否和下一个箭重合。那么我们就要把当前右边界更新为这两个箭的最小右边界,这样才能覆盖这两个箭的同时去判断下一个箭。
代码示例
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points,(a,b) -> Integer.compare(a[0],b[0]));
int count = 1;
for(int i = 1;i < points.length;i++){
if(points[i][0] > points[i - 1][1]){
count++;
}else{
points[i][1] = Math.min(points[i][1],points[i - 1][1]);
}
}
return count;
}
}
435. 无重叠区间
解题思路
上题我是不太会做的,看了下代码随想录,但这道题和上一题一样很好思考。
我们只要按左边界排队,然后进行比较,比较之后更新右边界的值为更小的那个即可。
代码示例
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals,(a,b) -> {
return a[0] - b[0];
});
int count = 0;
for(int i = 1;i < intervals.length;i++){
if(intervals[i - 1][1] > intervals[i][0]){
count++;
intervals[i][1] = Math.min(intervals[i][1],intervals[i - 1][1]);
}
}
return count;
}
}
763.划分字母区间
解题思路
这道题目题意就是让每个字母只出现在其中一个片段,并且尽可能划分更多片段。
我们首先用一个数组记录一下每个字母最后出现的次数,然后我们开始遍历字符串,当我们遍历到一个字符串时,我们直到该字符串最后出现的位置前都不能收菜(不能拆分)。直到我们遍历到它为止。当然在这中途我们会遍历其他字符串,这时可能它的最后出现位置更靠后了,那我们就得遍历更多。直到我们遍历到它为止才能切割。
代码示例
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> list = new LinkedList<>();
int[] edge = new int[26];
char[] chars = S.toCharArray();
for (int i = 0; i < chars.length; i++) {
edge[chars[i] - 'a'] = i;
}
int idx = 0;
int last = -1;
for (int i = 0; i < chars.length; i++) {
idx = Math.max(idx,edge[chars[i] - 'a']);
if (i == idx) {
list.add(i - last);
last = i;
}
}
return list;
}
}