对右边界排序,当前区间若大于之前的区间的右边界,则又多一个不重叠区间
记录所有无重叠区间,把总数减去不重叠
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int n = intervals.size();
int count = 1;
int end = intervals[0][1];
for (int i = 1; i < n; i++) {
if (intervals[i][0] >= end) {
count++;
end = intervals[i][1];
}
}
return n - count;
}
};
class Solution:
def partitionLabels(self, s: str):
hashtable = [0]*26
for i, ch in enumerate(s):
index = ord(ch) - ord("a")
hashtable[index] = i
ans = []
left = 0
right = 0
for i, ch in enumerate(s):
right = max(right, hashtable[ord(ch) - ord("a")])
if right == i:
ans.append(right - left + 1)
left = i + 1
return ans
将区间按左端点排序,若当前区间与前面区间有重叠,则合并,将右端设置为较大值
class Solution:
def merge(self, intervals: List[List[int]]):
ans = []
intervals.sort(key=lambda x : x[0])
n = len(intervals)
ans.append(intervals[0])
for i in range(1, n):
last = ans[-1]
if last[1] >= intervals[i][0]:
ans[-1] = [last[0], max(last[1], intervals[i][1])]
else:
ans.append(intervals[i])
return ans