435. Non-overlapping Intervals
跟用箭射气球差不多。先按照start 排序,然后遍历并更新右边界。注意边界条件,头尾相接不算重叠。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int len = intervals.length;
if(len == 1) {
return 0;
}
Arrays.sort(intervals, (a,b)->{
return Integer.compare(a[0], b[0]);
});
int count=0;
for(int i=1; i<len; i++) {
if(intervals[i][0] < intervals[i-1][1]) {
//overlap
count++;
intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);
}
}
return count;
}
}
763. Partition Labels 这题思路有了一半,结果越写越偏。 只保存同一个字母的最大右边界即可。保存所有的右边界写起来非常繁琐。
需要两个指针left和right更新当前区块的左右边界。
class Solution {
public List<Integer> partitionLabels(String s) {
int len = s.length();
if(len == 1) {
return new LinkedList<Integer>(Arrays.asList(1));
}
int[] hash = new int[26];
for(int i=0; i<s.length(); i++) {
hash[s.charAt(i) - 'a'] = i;
}
int left = 0;
int right = 0;
List<Integer> res = new LinkedList<Integer>();
for(int i=0; i<s.length(); i++) {
right = Math.max(right, hash[s.charAt(i) - 'a']);
if(i==right) {
res.add(right - left + 1);
left = i+1;
}
}
return res;
}
}
56. Merge Intervals 也是跟射箭差不多,需要两个指针保存当前块的左右边界。 注意不要漏了最后那一块。
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new LinkedList<>();
int len = intervals.length;
if(len == 1) {
return intervals;
}
Arrays.sort(intervals, (a,b)->Integer.compare(a[0], b[0]));
int start = intervals[0][0];
int rightBand = intervals[0][1];
for(int i=1; i<intervals.length; i++) {
if(intervals[i][0] > rightBand) {
res.add(new int[]{start, rightBand});
start = intervals[i][0];
rightBand = intervals[i][1];
}
else {
rightBand = Math.max(rightBand, intervals[i][1]);
}
}
res.add(new int[]{start, rightBand});
return res.toArray(new int[res.size()][]);
}
}