Day36 贪心 LeetCode 435 763 56
心得
- 盯着题中的最小去了,其实题意含义非常明确,主要最后结果不重叠即可,经过排序后,挑选出不重叠即可,重叠去除即可
题解
- 左或者右边界均可,右边界排序只需统计不重叠个数,然后作差即可,左侧则记录重叠区间即可
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) {
int count = 1;
sort(intervals.begin(), intervals.end(), cmp);
if (intervals.size() == 0) return 0;
int end = intervals[0][1];
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= end) {
end = intervals[i][1];
count++;
}
}
return intervals.size() - count;
}
};
心得
- 隐约感觉要用hash或者数组记录,但是对于数组截断的位置没想到
题解
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27] = {0}
int left = 0
int right = 0
vector<int> result
for (int i = 0
hash[s[i] - 'a'] = i
}
for (int i = 0
right = max(right, hash[s[i] - 'a'])
if (i == right) { // 到达最远收割
result.push_back(right - left + 1)
left = i + 1
}
}
return result
}
}
心得
- 判断重叠合并即可AC,可以通过lambda精简代码,同时善用容器,减少临时变量使用
题解
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if (intervals.size() == 0) return 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(intervals[i][1], result.back()[1]);
} else {
result.push_back(intervals[i]);
}
}
return result;
}
};