Day 36 贪心算法
435. 无重叠区间
差点就自己写出来了
class Solution {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: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]); // 注意这里要设置min,否则直接intervals[i][1] = intervals[i - 1][1]也会有问题}}return result;}
};
763. 划分字母区间
思路是能想到,但是实现起来就没那么得心应手了
使用哈希表来记录字母最后一次出现的位置还是比较巧妙的。
class Solution {
public:vector<int> partitionLabels(string s) {int table[26] = {0};for (int i = 0; i < s.size(); i++){table[s[i] - 'a'] = i;}int left = 0, right = 0;vector<int> rst;for (int i = 0; i < s.size(); i++){right = max(right, table[s[i] - 'a']);if (i == right){rst.push_back(right - left + 1);left = right + 1;}}return rst;}
};
56. 合并区间
有了前面的经验,这道题终于是自己解决了。
class Solution {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);vector<vector<int>> rst;int left = intervals[0][0], right = intervals[0][1];for (int i = 1; i < intervals.size(); i++){if (intervals[i][0] <= right) // 重叠{right = max(right, intervals[i][1]);}else{rst.push_back({left, right});left = intervals[i][0];right = intervals[i][1];}}rst.push_back({left, right});return rst;}
};