class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int res = 0;
Arrays.sort(intervals,(a, b) -> Integer.compare(a[0], b[0]));
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] < intervals[i-1][1]){
res++;
intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
}
}
return res;
}
}
763.划分字母区间
心得:carl哥的各种小技巧用的出神入化,太牛辣!
第一步给数组中的元素附最远的位置值的思路就不是很好想,或者说没接触过的根本想不到,太巧妙了!
第二步中使用双指针来限定每个组的范围也是非常的妙!虽然想着不是很好理解,但确实行之有效。
java复制代码
class Solution {
public List<Integer> partitionLabels(String s) {
int[] hash = new int[26];
// 给数组中的元素附最远位置值
for(int i = 0; i < s.length(); i++){
hash[s.charAt(i) - 'a'] = i;
}
List<Integer> res = new ArrayList<>();
int start = 0;
int end = 0;
for(int i = 0; i < s.length(); i++){
// 限定数组的结束位置
end = Math.max(end, hash[s.charAt(i) - 'a']);
if(i == end){
res.add(i-start+1);
start = i+1;
if(start >= s.length()) break;
}
}
return res;
}
}
56.合并区间
和435与452思路基本相似,可以轻松拿下!
java复制代码
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
// 要学会这个骚操作,可以定义为List<int[]>,然后使用toArray方法就可以变为int[][]
List<int[]> res = new ArrayList<>();
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] > intervals[i-1][1])
res.add(intervals[i-1]);
else{
intervals[i][1] = Math.max(intervals[i-1][1], intervals[i][1]);
intervals[i][0] = Math.min(intervals[i-1][0], intervals[i][0]);
intervals[i-1][0] = -1;
intervals[i-1][1] = -1;
}
}
res.add(intervals[intervals.length - 1]);
return res.toArray(new int[res.size()][]);
}
}