435. 无重叠区间
题目链接:https://leetcode.cn/problems/non-overlapping-intervals/submissions/
代码:
class Solution {
public:
static bool cmp(vector<int>& A ,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 result = 0;
for(int i = 1; i < intervals.size();i++)
{
if(intervals[i][0] < intervals[i-1][1])
{
result++;
intervals[i][1] = min(intervals[i-1][1],intervals[i][1]);
}
}
return result;
}
};
这个和昨天的一样 但是要注意:intervals[i][1] = min(intervals[i-1][1],intervals[i][1]);
这里面要是min 反正都是要删掉一个 那就删掉大的那个
763.划分字母区间
题目链接:https://leetcode.cn/problems/partition-labels/submissions/
代码:
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> pos(27,0);
for(int i = 0; i < s.size(); i++)
{
pos[s[i] - 'a'] = i;
}
vector<int> result;
int left = 0;
int right = 0;
for(int i = 0; i < s.size(); i++)
{
right = max(right,pos[s[i] - 'a']);
if(i == right)
{
result.push_back(right - left + 1);
left = i + 1;
}
}
return result;
}
};
这个还是挺好理解的 就是我想不到
确定每个元素的最远位置 然后开始遍历 好巧妙啊
56. 合并区间
题目链接:https://leetcode.cn/problems/merge-intervals/
代码(错误):
class Solution {
public:
static bool cmp(vector<int>& A, 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>> result;
vector<int> tmp;
for(int i = 1; i < intervals.size(); i++)
{
if(intervals[i][0] < intervals[i-1][1])
{
intervals[i][0] = min(intervals[i][0],intervals[i-1][0]);
intervals[i][1] = max(intervals[i][1],intervals[i-1][1]);
tmp.clear();
tmp.push_back(intervals[i][0]);
tmp.push_back(intervals[i][1]);
}
else
{
result.push_back(tmp);
tmp.clear();
tmp.push_back(intervals[i][0]);
tmp.push_back(intervals[i][1]);
result.push_back(tmp);
}
}
return result;
}
};
这个代码是不对的 但是我感觉大体思路应该没问题 先记录下 到时候再想想怎么改
代码(正确):
class Solution {
public:
static bool cmp(vector<int>& A, 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>> result;
vector<int> tmp;
if(intervals.size() == 0)
return result;
result.push_back(intervals[0]);
for(int i = 1; i < intervals.size(); i++)
{
if(result.back()[1] >= intervals[i][0])
result.back()[1] = max(intervals[i][1],result.back()[1]);
else
result.push_back(intervals[i]);
}
return result;
}
};