LeetCode刷题流程:贪心算法-12.452. 用最少数量的箭引爆气球

题目与题解
{{6,7},{4,8},{1,5}}

  8
7 |
6 |
  | 5
  4 |
    |
    |
    1

标志:6,4,1
6—4一箭;1—二箭

{{1,5},{6,7},{4,8}}

对每一个气球的最低端排序,可以保障每一个气球最低端有序降低,此时通过判断前一个气球的最低端与后一个气球的最高端,就可以判断是否需要增加箭。

    8
  7 |
  6 |
5   |
|   4
|
|
1

标志:5,7,8
5—一箭;7—8二箭
对每一个气球的最高端排序,可以保障每一个气球最高端有序上升,此时通过判断前一个气球的最高端与后一个气球的最低端,就可以判断是否需要增加箭。

基于贪心来对原本的气球序列的排序需要对应相应的增加箭的判决方式

如,对气球最高端排序:

8
| 7
| 6
|  5
4  |
   |
   |
   1

判断后一个最高端是否大于其最低端,如此这样,{1,5}同样满足条件,那么总的箭数量就是1。解答错误。

应该保证气球的最高端呈上升梯状,或者气球的最低端呈下降梯状,然后再判断另一端。控制一个变量,再判断另一端,这样的思路才能保证解题正确。

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        int arrow = 1;
        //满足贪心要求,将所有气球按照最低高度排
        //这里使用的是气球的最低端作为参考,那么应该对最低端作为贪心的排序标准
        //相反,如果使用气球的最高端作为参考,那么应该对最高端作为贪心的排序标准
        sort(points.begin(), points.end(), [=](const vector<int>&first, const vector<int>&second) {return first[0] > second[0]; });
        //得到前一段的最低位置,如果大于下一段最高位置;当前位置换成下一段的最低位置,继续判断
        int high = 0, low = 0;
        low = points[0][0];
        for (int part=1;part<points.size();++part)
        {
            high = points[part][1];
            if (low > high)
            {
                ++arrow;
                low = points[part][0];
            }
        }
        return arrow;
    }
};
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.empty()) {
            return 0;
        }
        sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) {
            return u[1] < v[1];
        });
        int pos = points[0][1];
        int ans = 1;
        for (const vector<int>& balloon: points) {
            if (balloon[0] > pos) {
                pos = balloon[1];
                ++ans;
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值