#435 无重叠区间 M
20min 算是自己做出来的,但我本来思路是排序之后,有重叠就删除跨度更大的,然后发现不对,就改成了有重叠就删除结束更晚的,就对了, my code:
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());
int cnt=0;
for(int i=0;i+1<intervals.size();i++){
if(intervals[i][1]<=intervals[i+1][0]) continue;
//if overlap
printf("overlap %d %d\n", i, i+1);
if(intervals[i][1]<intervals[i+1][1]){
intervals[i+1][1]=intervals[i][1];
intervals[i+1][0]=intervals[i][0];
}
//delete range larger one
/*
else if (intervals[i+1][1]-intervals[i+1][0]>intervals[i][1]-intervals[i][0]){
//delete the larger one
intervals[i+1][1]=intervals[i][1];
intervals[i+1][0]=intervals[i][0];
}*/
cnt++;
}
return cnt;
}
随想录的思路是,先排序,然后挨个数非重叠区间个数,然后再减去。满巧妙的
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;
}
没错没错, 我就是那题做出来了,这题就也会做 。
另外关于本题的排序:按start,end都可以,start完了再按end排也可以,总之就是让他稍微按顺序一点,尽可能重叠
#763 划分字母区间 M
我自己想和实现了25min,没做出来。这回知道及时停止了很好。随想录思路:
没有接触过这种题目的话,还挺有难度。
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
vector<int> partitionLabels(string s) {
vector<int> res;
int hash[30]={};
for(int i=0;i<s.size();i++){
hash[s[i]-'a']=i;
}
int right=0;
int left=0;
for(int i=0;i<s.size();i++){
right=std::max(right,hash[s[i]-'a']);
if(i==right){
res.push_back(right-left+1);
left=i+1;
}
}
return res;
}
#56 合并区间 M
20min, 算是自己做的(gpt稍微修改了一下)思路是排序后,如果overlap就合并然后加到res
随想录思路差不多(其实我没仔细看,今天又是累了)
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];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
vector<vector<int>> res;
int start = intervals[0][0];
int end = intervals[0][1];
for(int i = 1; i < intervals.size(); i++){
if(end >= intervals[i][0]){
// if overlap
end = max(end, intervals[i][1]);
}
else{
res.push_back({start, end});
start = intervals[i][0];
end = intervals[i][1];
}
}
// Add the last interval
res.push_back({start, end});
return res;
}