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)