Day36 贪心 LeetCode 435 763 56

65 阅读1分钟

Day36 贪心 LeetCode 435 763 56

435. 无重叠区间

心得

  • 盯着题中的最小去了,其实题意含义非常明确,主要最后结果不重叠即可,经过排序后,挑选出不重叠即可,重叠去除即可

题解

  • 左或者右边界均可,右边界排序只需统计不重叠个数,然后作差即可,左侧则记录重叠区间即可
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;
    }
};

763. 划分字母区间

心得

  • 隐约感觉要用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; i < s.size(); i++) {
            hash[s[i] - 'a'] = i; // 记录出现的最远距离
        }
        for (int i = 0; i < s.size(); i++) {
            right = max(right, hash[s[i] - 'a']); //  找到当前记录的最远距离
            if (i == right) { // 到达最远收割
                result.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return result;
    }
};

56. 合并区间

心得

  • 判断重叠合并即可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;
    }
};