当前位置: 首页 > news >正文

贪心算法之重叠区间问题

以下四个题都是重叠区间问题

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

  • 为了让气球尽可能重叠,先按照气球起始位置由大到小排序
  • tips:sort默认就可以实现以上排序,不需要写cmp
  • 重点:当下一个气球的左边界不小于上一个气球的右边界时(即有重叠的情况),为了判断再下一个气球能否和这两个有重叠,就需要将右边界 point[i][1] 置成小的那个右边界 min(point[i-1][1] , point[i][1])
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(), points.end());
        int ret = 1;
        for (int i = 1; i < points.size(); i++) {
            if (points[i][0] > points[i - 1][1]) ret++;
            else points[i][1] = min(points[i - 1][1], points[i][1]);
        }
        return ret;
    }
};

435. 无重叠区间

与上一个题极其相似,首先按照左边界排序,当重叠的时候,舍弃重叠的右边长的那个区间(即将右边界定为小的那个),ret++记录重叠区间个数。

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        int ret = 0;
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                ret++;
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
            }
        }
        return ret;
    }
};

763. 划分字母区间

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27] = {0};
        for (int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a'] = i;
        }
        vector<int> ret;
        int left = 0, right = 0;
        for (int i = 0; i < s.size(); i++) {
            right = max(hash[s[i] - 'a'], right);
            if (right == i) {
                ret.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return ret;
    }
};

56. 合并区间

和上面的435差不多,先按照左边界排序好,将第一组数据添加到ret中,之后如果满足后一个的左边界小于等于这个的右边界时候,更新ret中的这个(ret.back()[1]更新成大的右边界),不满足就把下一个添加进来,for循环是从i=1开始

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        if (intervals.size() == 1)
            return intervals;
        vector<vector<int>> ret;
        ret.push_back(intervals[0]);
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] <= ret.back()[1]) {
                ret.back()[1] = max(ret.back()[1], intervals[i][1]);
            } else
                ret.push_back(intervals[i]);
        }
        return ret;
    }
};

相关文章:

  • BCLinux8.*构建部署nmap 7.95
  • 网络协议九 应用层 HTTPS
  • Spring Boot常用注解
  • MKS产品PECVD设备中应用PPT课件
  • 「Java 项目详解」API 文档搜索引擎(万字长文)
  • mapstruct学习笔记
  • STM32标准库学习笔记-1.基础知识
  • IOC--自定义IOC容器
  • windows安装android studio
  • 【ai】Easy-RAG 不行啊,RAGFlow官方demo行
  • 分布式日志
  • Vue是如何实现nextTick的?
  • Dockerfile搭建LNMP
  • 用Python实现9大回归算法详解——01. 线形回归算法
  • 《工厂模式在软件开发中的深度剖析与应用》
  • 苹果在iOS 18.1中向第三方开发者开放iPhone的NFC芯片
  • JavaScript AI 编程助手
  • Android之service两种启动方式的异同
  • 【自动驾驶】ROS远程节点的分布式通信
  • 【TiDB】09-修改tidb客户端访问密码
  • 青岛鞋企双星名人集团家族内斗:创始人发公开信指控子孙夺权
  • “五一”假期国内出游3.14亿人次,同比增长6.4%
  • 禅定佛的微笑,从樊锦诗提到过的那尊说起
  • 同路人才是真朋友——驻南苏丹使馆援助东赤道州人道主义物资交接仪式侧记
  • 浙江医生举报3岁男童疑遭生父虐待,妇联:已跟爷爷奶奶回家
  • 中国驻日本大使吴江浩就日本民用飞机侵闯我钓鱼岛领空向日方提出严正交涉