435.无重叠区间
思路:找到删除几个区间,让题目给出的区间没有重叠部分,那么首先我们先进行排序(按照左边界排序),那么下一个区间的左边界小于上一个区间的右边界,那么这两个区间一定有重叠的部分,说明这两个区间必须要移除掉一个,那么这两个移除掉哪一个呢?应该移除掉两个区间中,右边界更大的那一个,这样才能最大限度避免对于下一个区间左边界与这两个区间重复!那么如果没有重复,那么就不更新什么!
时间复杂度:O(nlogn)
空间复杂度:O(n)
sort()中涉及到一个快排的问题!
class Solution {
public:int result=0;static bool cmp(vector<int>& a,vector<int>& b){return a[0]<b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end());for(int i=1;i<intervals.size();i++){if(intervals[i][0]<intervals[i-1][1]){result++;intervals[i][1]=min(intervals[i-1][1],intervals[i][1]);}}return result;}
};
763.划分字母区间
思路:这道题没啥思路,看了答案,学习一下!先用一个数组记录一下(有点类似于哈希表的做法),记录一下每个字母在该数组中最远的位置,然后再去遍历,遍历到最远的地方,此处就是分割点!
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:vector<int> partitionLabels(string s) {int hash[27]={0};for(int i=0;i<s.size();i++){hash[s[i]-'a']=i;}vector<int> result;int left=0;int right=0;for(int i=0;i<s.size();i++){right=max(right,hash[s[i]-'a']);if(i==right){result.push_back(right-left+1);left=i+1;}}return result;}
};
56.合并区间
思路:最开始的时候思路也是先进行排序,然后判断两个区间是否重叠,将区间更新成更大的一个区间,但是对于怎么加入到
result
中,出现问题了,如果不先将第一个加入区间,利用第一个去判断,那么在后面会出现仅有一个的无法加入区间!(这里没想到)
时间复杂度:O(nlogn)
空间复杂度:O(logn)
class Solution {
public:static bool cmp(vector<int>& a,vector<int>& b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),cmp);vector<vector<int>> result;result.push_back(intervals[0]);for(int i=1;i<intervals.size();i++){if(result.back()[1]>=intervals[i][0]){result.back()[1]=max(result.back()[1],intervals[i][1]);}else{result.push_back(intervals[i]);}}return result;}
};
总结: 重叠区间的问题,一般都是将其先排序,然后判断上一个区间的右边值与下一个区间的左边值是否重叠等问题!