452
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length==0) {
return 0;
}
Arrays.sort(points,(a,b)->Integer.compare(a[0], b[0]));
//这里是设置的sort的自定义的sort
int res=1;
//0已经排除了所以最少是1
for(int i=1;i<points.length;i++){
if (points[i][0]>points[i-1][1]) {
res+=1;
}else{
points[i][1]=Math.min(points[i-1][1], points[i][1]);
//取右边界的最小值
}
}
return res;
}
}
这里的巧妙之处在于更新新的右边届,遇到不重合就加一个剑,还有就是循环是从1开始的因为要用到i-1;
无重叠区间
import java.util.Arrays;
public class day33_435_无重叠区间 {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length==0) {
return 0;
}
Arrays.sort(intervals,(a,b)->Integer.compare(a[0], b[0]));
//这里也是拍过许的
int res=0;
for(int i=1;i<intervals.length;i++){
if (intervals[i][0]<intervals[i-1][1]) {
res+=1;
intervals[i][1]=Math.min(intervals[i-1][1],intervals[i][1] );
}else{
}
}
return res;
}
}
这个自己的思路和上一题的是改的
这个就是也是比较这个的开头和上个的结尾,如果重合就加一并且更新上一个的末尾更新为最段的就那个末尾,然后接着比较下一个与上面那个更新过的。要注意的是这个序列是按照开头拍过序的才醒
划分字母区间
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;
沥青思路