@代码随想录算法训练营第36天 | LeetCode435. 无重叠区间,763.划分字母区间,56. 合并区间
435. 无重叠区间
第一遍读题思考
感觉跟那个用最少的箭射气球差不多,一根箭贯穿的区间只能保留一个
代码随想录解法思路
一样
c++代码具体实现注意事项
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
if(a[0]==b[0]) return a[1]<b[1];
return a[0]<b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int count{1};
int curRight = intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(intervals[i][0]>=curRight){
count++;
curRight = intervals[i][1];
}
else{
curRight = min(curRight, intervals[i][1]);
}
}
return intervals.size()-count;
}
};
763.划分字母区间
第一遍读题思考
题目理解都有点费劲。。。,所以就是说看当前元素最远在哪里呗?如果一连串的元素最远的位置于该串元素最后一个的位置相同就可以分割了呗。
代码随想录解法思路
差不多,但是在获得当前元素的最远边界的时候借用了数组的哈希表,比双指针要快多了。
c++代码具体实现注意事项
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;
}
int curRight = hash[s[0]-'a'];
vector<int> result;
result.push_back(-1);
for(int i=0;i<s.size();i++){
if(hash[s[i]-'a']>curRight){
curRight = hash[s[i]-'a'];
}
if(i==curRight){
result.push_back(curRight);
if(i!=s.size()-1) curRight = hash[s[i+1]-'a'];
}
}
for(int i=result.size()-1;i>0;i--){
result[i] -= result[i-1];
}
return vector<int>(result.begin()+1, result.end());
}
};
56. 合并区间
第一遍读题思考
区间重叠问题,跟那个射气球的类似,直接用那个代码改一下就行。
代码随想录解法思路
一个套路
c++代码具体实现注意事项
class Solution {
private:
static bool cmp(const vector<int>& a, const vector<int>& b){
// if(a[0]==b[0]) return a[1]>b[1];
return a[0]<b[0];
}
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int curRight=intervals[0][1];
int curLeft = intervals[0][0];
vector<vector<int>> result;
for(int i=1;i<intervals.size();i++){
if(intervals[i][0]>curRight){
result.push_back({curLeft,curRight});
curLeft = intervals[i][0];
curRight = intervals[i][1];
}
else{
curRight = max(intervals[i][1], curRight);
}
}
result.push_back({curLeft,curRight});
return result;
}
};