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

【区间贪心】合并区间 / 无重叠区间 / 用最少数量的箭引爆气球 / 俄罗斯套娃信封问题

头像
⭐️个人主页:@小羊
⭐️所属专栏:贪心算法
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

      • 合并区间
      • 无重叠区间
      • 用最少数量的箭引爆气球
      • 俄罗斯套娃信封问题


合并区间

  • 合并区间

在这里插入图片描述

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

无重叠区间

  • 无重叠区间

在这里插入图片描述

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        int ret = 0, right = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++)
        {
            int a = intervals[i][0], b = intervals[i][1];
            if (a < right)
            {
                ret++;// 删除右端点较大的区间
                right = min(right, b);
            }
            else right = b;
        }
        return ret;
    }
};

用最少数量的箭引爆气球

  • 用最少数量的箭引爆气球

在这里插入图片描述

贪心策略:我们在射箭的时候,要发挥每一支箭最大的作用,应该把互相重叠的区间统一引爆。

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(), points.end());
        int ret = 0, right = points[0][1];
        for (int i = 1; i < points.size(); i++)
        {
            int a = points[i][0], b = points[i][1];
            if (a <= right) right = min(right, b);
            else 
            {
                right = b;
                ret++;
            }
        }
        return ret + 1;
    }
};

俄罗斯套娃信封问题

  • 俄罗斯套娃信封问题

在这里插入图片描述

动态规划解法,会超时:

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        sort(e.begin(), e.end());
        int n = e.size(), ret = 0;
        vector<int> dp(n, 1);
        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < i; j++)
                if (e[i][0] > e[j][0] && e[i][1] > e[j][1])
                    dp[i] = max(dp[i], dp[j] + 1);
            ret = max(ret, dp[i]);
        }
        return ret;
    }
};

重写排序+贪心+二分:

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        sort(e.begin(), e.end(), [](const vector<int>& v1, const vector<int>& v2){
            return v1[0] == v2[0] ? v1[1] > v2[1] : v1[0] < v2[0];
        });
        vector<int> ret;
        ret.push_back(e[0][1]);
        for (int i = 1; i < e.size(); i++)
        {
            int a = e[i][1];
            if (a > ret.back()) ret.push_back(a);
            else 
            {
                int left = 0, right = ret.size() - 1;
                while (left < right)
                {
                    int mid = (left + right) >> 1;
                    if (ret[mid] < a) left = mid + 1;
                    else right = mid;
                }
                ret[left] = a;
            }
        }
        return ret.size();
    }
};

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像

相关文章:

  • 使用在 Google Kubernetes Engine 上运行的 Vertex AI 开始使用 Elastic Chatbot RAG 应用程序
  • opengles,VBO,EBO,VAO啥含义,使用流程
  • Chrome 135 版本开发者工具(DevTools)更新内容
  • C#二叉树
  • JavaScript基础--23-高阶函数详解
  • 科普:原始数据是特征向量么?
  • shadcn 使用步骤与注意点
  • Java面试黄金宝典41
  • k8s 1.30.6版本部署(使用canal插件)
  • Axure中继器(Repeater): 列表展示
  • 火山模型的优缺点与优化实践 | OceanBase SQL优化
  • C++·包装器
  • 新一代达梦官方管理工具SQLark:可视化建表操作指南
  • verilog有符号数的乘法
  • 华为存储考试内容HCIP-Storage
  • RPC 2025/4/8
  • 【QT】 进程
  • 企业级Java开发工具MyEclipse v2025.1——支持AI编码辅助
  • QML面试笔记--UI设计篇01常用控件分类
  • MFC工具栏CToolBar从专家到小白
  • 建立网站怎么做/360推广登录入口
  • 苏州市住房和城乡建设局官方网站/有什么平台可以发布推广信息
  • 阿拉善左旗建设局网站/今日最近的新闻大事10条
  • 大陆做爰视频网站/新平台推广
  • 国外网站做营销/windows优化大师是哪个公司的
  • 医院网站建设趋势/成都网络营销公司排名