赞
踩
遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间
遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间
- 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)
找到出现过字母的最远边界,该点就是分割点
先用哈希表遍历一遍数组,同时记录每个字母出现的次数。
再遍历一遍数组,用right和left代表分段的右左区间端点,取right和字母最远的边界的最大值更新right,如果right==i,那就找到了分割点
- 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)
判断何时更新区间的右端点
先按照左端点排序
如果i的左端点>i+1的右端点,把区间的左端点更新为i和i+1左端点的最大值
否则就把数组intervals[i]加进去
- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。