90、贪心-LeetCode-452.用最少数量的箭引爆气球

本文介绍了一种算法思路,通过二维数组排序和贪心策略来解决题面中关于如何用最少的弓箭引爆所有气球的问题。关键步骤包括对气球尾部按直径排序,然后从尾部开始射箭,跳过已引爆的气球。代码实现展示了如何在Java中运用这种技巧计算所需的最小箭矢数。
摘要由CSDN通过智能技术生成

题目描述

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

来源:力扣(LeetCode)

思路

1)将尾部排序,每次从尾部射箭,下次从还没有引爆的第一个气球的尾部继续!

每次在坐标轴上走尽可能大的距离!在这个前提下,有可能已经引爆了其他气球!就跳过这些气球,继续往下找!

2)二维数组比较的写法:

        Arrays.sort(points,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] < o2[1]) return -1;
                else return 1;
            }
        });
Arrays.sort(points, (p1, p2) -> p1[1] < p2[1] ? -1 : 1);

代码

1)排序 + 贪心

class Solution {
    public int findMinArrowShots(int[][] points) {
        
        //区间有重叠,就会一只箭全部射穿
        //二维数组的排序需要使用 比较器
        int res = 0;//记录多少箭

        //按照尾部排序,头部不用处理
        Arrays.sort(points,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] < o2[1]) return -1;
                else return 1;
            }
        });
        //从尾部找,按照尾部的大小顺序来找;用头部来包含
        for(int i = 0;i < points.length;i++){
            res++;
            int temp = points[i][1];//取到尾部大小
            //头部比较
            while(i < points.length && points[i][0] <= temp){
                i++;
            }
            //for中还有一个i++,这里要 --
            i--;
        }
        return res;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值