无重叠区间
解题代码
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0]<b[0];
}
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(intervals[i][0]>=end){
count++;
end=intervals[i][1];
}else end=min(end, intervals[i][1]);
}
return intervals.size()-count;
}
};
解题说明
该题目的解法有点神奇,如图
求最少删除多少个区间,使区间无重叠,就是同届重叠个数,然后 总数 - 重叠区间 ,这样就能得到结果了。
- 其实该题目和上一个代码随想录上的题目是差不多的,但是就是场景有些差异,但是我就是因为这个场景,所以,也就没写出来。
划分字母区间
解题代码
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> result;
int hash[26] = {0};
for (int i = 0; i < s.length(); i++)
hash[s[i] - 'a'] = i;
int left = 0, right = 0;
for (int i = 0; i < s.length(); i++) {
right = max(right, hash[s[i] - 'a']);
if (right == i) {
// right = hash[s[i] - 'a'];
result.push_back(right - left + 1);
left = i + 1;
}
}
return result;
}
};
说明
for (int i = 0; i < s.length(); i++)
hash[s[i] - 'a'] = i;
这个for循环是统计最后出现的位置,直接用i给hash数组赋值就行,不用求max。
对于right不管是什么条件都是要更新的,换句话说就是要时时刻刻更新,所以就直接跟新了。
而且right是要和i比较,而不是和hash[s[i] - 'a']比较。