435. 无重叠区间 题目链接
思路
遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间
解题方法
遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间
Code
class Solution {
public:static bool cmp (const vector<int>&a,const vector<int>&b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if(intervals.size()==0)return 0;sort(intervals.begin(),intervals.end(),cmp);int count=1;int end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(end<=intervals[i][0]){end=intervals[i][1];count++;}}return intervals.size()-count;}
};
复杂度
时间复杂度
O(nlogn)
空间复杂度
O(n)
763.划分字母区间 题目链接
思路
找到出现过字母的最远边界,该点就是分割点
解题方法
先用哈希表遍历一遍数组,同时记录每个字母出现的次数。
再遍历一遍数组,用right和left代表分段的右左区间端点,取right和字母最远的边界的最大值更新right,如果right==i,那就找到了分割点
Code
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;}
};
复杂度
时间复杂度
O(n)
空间复杂度
O(1)
56. 合并区间 题目链接
思路
判断何时更新区间的右端点
解题方法
先按照左端点排序
如果i的左端点>i+1的右端点,把区间的左端点更新为i和i+1左端点的最大值
否则就把数组intervals[i]加进去
Code
class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>>result;sort(intervals.begin(),intervals.end(),[](const vector<int>&a,const vector<int>&b){return a[0]<b[0];});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;}
};
复杂度
时间复杂度
O(nlogn)
空间复杂度
O(nlogn)