目录
435 无重叠区间
将intervals数组按照左端点进行升序排序。
设置变量len标志此时新加入端点后所有区间的位置,将其赋初值为第一对区间的右端点,因为该点是一定可达的。设置变量res来存储需要移除空间的数量。
遍历intervals数组,有如下两种情况
- 如果当前区间右端点小于或者等于新区间的左端点,说明可以将新区间加入到总区间中,将len赋值为新区间的右端点。
- 如果当前总区间右端点大于新区间的左端点,说明加入发生了冲突,将res++。局部最优是在保证res较小的情况下使得总区间范围尽可能小,如果发生以下情况,即当前总区间右端点大于新区间的右端点,为了使得较小区间总范围较小,我们应该放弃上一个端点选择新端点,所以应该进行判断使得len为总区间右端点和新区间右端点之间的最小值。
import java.util.Arrays;
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals,(o1, o2) -> {
if(o1[0] == o2[0]){
return o1[1] - o2[1];
}
return o1[0] - o2[0];
});
int res = 0;
int len = intervals[0][1];
for(int i = 1;i < intervals.length;i++){
if(len <= intervals[i][0]){
len = intervals[i][1];
}else{
res++;
len = Math.min(len,intervals[i][1]);
}
}
return res;
}
}
时间复杂度O(nlogn)排序的时间复杂度为nlogn,遍历的时间复杂度为n
空间复杂度O(logn)排序所需要的栈空间
763 划分字母区间
设置数组hash来标记出s中每个字符的最远下标。
设置l标记新区间的开始,r标记新区间的结尾,vector<int>res来存储答案。
遍历s,将r设置为遍历到的字符在hash中存储的值。
直到i遍历到r时,由于题意需要划分尽可能多的区间,此时需要开辟新区间,将r-l+1存储到res中代表上一个区间的长度,l赋值为i+1,表示新区间的开始;
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27];
for(int i = 0;i < s.size();i++){
hash[s[i] - 'a'] = i;
}
vector<int>res;
int l = 0;
int r = 0;
for(int i = 0;i < s.size();i++){
r = max(hash[s[i] - 'a'],r);
if(i == r){
res.push_back(r - l + 1);
l = i + 1;
}
}
return res;
}
};
时间复杂度O(n)
空间复杂度O(1)
56 合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>>res;
if(intervals.size() == 1)return intervals;
sort(intervals.begin(),intervals.end(),[](vector<int>&a,vector<int>&b){return a[0] < b[0];});
int l = intervals[0][0];
int r = intervals[0][1];
for(int i = 1;i < intervals.size();i++){
if(r >= intervals[i][0]){
r = max(intervals[i][1],r);
}
else{
res.push_back({l,r});
l = intervals[i][0];
r = intervals[i][1];
}
if(i == intervals.size() - 1)res.push_back({l,r});
}
return res;
}
};
时间复杂度O(nlogn)排序所需要的时间复杂度
空间复杂度O(nlogn)排序所需要的空间复杂度