435.无重叠区间
解题思路
-
按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。
Java代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//按照左边界升序排序 右边界排序 a[1],b[1]
Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
//记录不重叠的count
int count = 1;
for (int i=1; i <intervals.length; i++) {
if (intervals[i][0] >= intervals[i-1][1]) { //i和i-1不挨着
count++;
} else {
//i和i-1挨着
intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);
}
}
return intervals.length - count;
}
}
763.划分字母区间
解题思路
-
统计每一个字符最后出现的位置
-
从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
Java代码
class Solution {
public List<Integer> partitionLabels(String s) {
LinkedList<Integer> res = new LinkedList<>();
if (s.length() == 1) {
res.add(1);
return res;
}
char[] ch = s.toCharArray();
int[] edge = new int[26];
//记录字母最后出现的位置 ch[i] - a是字符转int,同一字符的值会一直被i更新
for (int i = 0; i < ch.length; i++) {
edge[ch[i] - 'a'] = i;
}
int left =0;
int right =0;
for (int i = 0; i < ch.length; i++) {
right = Math.max(right, edge[ch[i] - 'a']);
//字符最远出现位置下标和当前下标相等
if (right == i) {
res.add(right - left + 1);
left = i+1;
}
}
return res;
}
}
56.合并区间
解题思路
-
其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。
Java代码
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new ArrayList<>();
Arrays.sort(intervals, (a,b)-> Integer.compare(a[0], b[0]));
int start = intervals[0][0];
int rightRange = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
//i与i-1不挨着 加入区间并更新start
if (intervals[i][0] > rightRange) {
res.add(new int[]{start, rightRange});
start = intervals[i][0];
rightRange = intervals[i][1];
} else {
rightRange = Math.max(rightRange, intervals[i][1]);
}
}
res.add(new int[]{start, rightRange});
return res.toArray(new int[res.size()][]);
}
}