第三十天打卡,不知不觉已经一个月了!今天的题都是重叠区间的题目,由于之前做过还有印象,这次都是比较快的做出来了,不过第三题不看提示还真的想不到是重叠区间的题目,三题的思路都是更新重叠区间的边界。


452.用最少数量的箭引爆气球

题目链接

做题过程

  • 先把区间左边界按从小到大的顺序排序,遍历的时候更新右边界,当区间与右边界没有重合区间时,更新右边界为区间右边界;当区间与右边界有重合区间时,更新右边界为当前右边界和区间右边界的最小值。

知识点

  • 局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

贪心算法

class Solution {
public:
    static bool cmp(vector<int>&l, vector<int>&r) {
        if (l[0] == r[0]) return l[1] < r[1];
        return l[0] < r[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        int result = 1;
        sort(points.begin(), points.end(), cmp);
        int right = points[0][1];
        for (int i = 1; i < points.size(); i++) {
            if (points[i][0] > right) {
                result++;
                right = points[i][1];
            } else {
                right = min(points[i][1], right);
            }
        }
        return result;
    }
};

435.无重叠区间

题目链接

做题过程

  • 按左区间排序求出重叠区间的数量,跟射气球很像

贪心算法

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) {
        int result = 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int right = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] >= right) {
                right = intervals[i][1];
            } else {
                right = min(right, intervals[i][1]);
                result++;
            }
        }
        return result;
    }
};

763.划分字母区间

题目链接

做题过程

  • 在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了
  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

贪心算法

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int>result;
        vector<int>lastIndex(26);
        int cur_end = -1;
        int pre_end = -1;
        for (int i = 0; i < s.size(); i++) {
            lastIndex[s[i] - 'a'] = i;
        }
        for (int i = 0; i < s.size(); i++) {
            cur_end = max(cur_end, lastIndex[s[i] - 'a']);
            if (i == cur_end) {
                result.push_back(cur_end - pre_end);
                pre_end = cur_end;
            }
        }
        return result;
    }
};

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部