首页 > 其他分享 >【代码随想录】刷题记录(92)-用最少数量的箭引爆气球

【代码随想录】刷题记录(92)-用最少数量的箭引爆气球

时间:2025-01-07 16:30:07浏览次数:3  
标签:right curr 阈值 min 随想录 points 92 气球 刷题

题目描述:

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

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

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

 

示例 1:

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。

示例 2:

输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。

示例 3:

输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]。
- 在x = 4处射出箭,击破气球[3,4]和[4,5]。

 

 

提示:

  • 1 <= points.length <= 105
  • points[i].length == 2
  • -231 <= xstart < xend <= 231 - 1

 

我的作答:

思路是先按照左边界排序,如果某个元素的左边界和上一个元素的右边界完全没有重合,说明需要一支新的箭,否则如果有重合,则更新当前元素的右边界为上一个元素右边界和这个元素右边界的最小值,这样做可以判断是否和下一个元素的左边界重合,即判断射当前气球和上一个气球的箭能不能射下一个气球。。。不断叠加。。

class Solution(object):
    def findMinArrowShots(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        if len(points)==0:
            return 0
        points.sort(key=lambda x:(x[0], x[1]))
        result = 1
        for i in range(1, len(points)):
            if points[i][0]>points[i-1][1]:
                result += 1
            else: #更新右边边界
                points[i][1] = min(points[i][1], points[i-1][1])
        return result

bd4678e72f144e849c99cc023333f129.png

 

参考:

设置阈值的方式

class Solution(object):
    def findMinArrowShots(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        if len(points) == 0:
            return 0
            
        points.sort(key = lambda x: x[0])

        # points已经按照第一个坐标正序排列,因此只需要设置一个变量,记录右侧坐标(阈值)
        # 考虑一个气球范围包含两个不相交气球的情况:气球1: [1, 10], 气球2: [2, 5], 气球3: [6, 10]
        curr_min_right = points[0][1]
        count = 1
        
        for i in points:
            if i[0] > curr_min_right:
                # 当气球左侧大于这个阈值,那么一定就需要再发射一只箭,并且将阈值更新为当前气球的右侧
                count += 1
                curr_min_right = i[1]
            else:
                # 否则的话,我们只需要求阈值和当前气球的右侧的较小值来更新阈值
                curr_min_right = min(curr_min_right, i[1])
        return count

979e6f33d04d49dda042aca89665074d.png

 

标签:right,curr,阈值,min,随想录,points,92,气球,刷题
From: https://blog.csdn.net/Aerochacha/article/details/144987742

相关文章

  • SpringBoot农耕知识查询平台92fy3(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,植物种类,耕作准备,育种选择,作物生长,作物结果,作物收获开题报告内容一、研究背景与意义随着信息技术的飞速发展,各行各业都在积极探索数字化转型的路径。......
  • 代码随想录算法训练营第五十六天|KM108.冗余连接|KM109.冗余连接Ⅱ
    108.冗余连接本题光看题目没理解具体什么意思;看了题解有点明白了;(个人觉得还是力扣的题目描述比较容易理解)题目意思:大概就是加一条边使树结构有环,然后再环中去掉一条边(如果环中多条边可取,则去掉最后一条边),仍然变成一颗树结构;思路:观察两个节点是否再一个集合,如果不在,也可以将......
  • 代码随想录算法训练营第二十八天-贪心算法-122. 买卖股票的最佳时机II
    有奇妙的解法分析要获得利润,就是当天卖出前一天买入的的利润,也就是当天价格减去前一天的价格通过这样的运算,可以得到一个新的序列,这个序列就是上一道53的最大子序和的应用了而且把这些子序和中所有正数值都加到一起就是最大利润了#include<iostream>#include<vector>c......
  • 1929-2024年全球气象站点逐日气象指标数据(气温、降水量、风速等12项)
    全球气象站点的逐日12项气象指标数据,数据时间为1929年-2024年,地理坐标系是WGS-84。本数据的气象指标包括:平均温度、平均露点、平均海平面压力、平均观测站压力、平均能见度、平均风速、最大持续风速、最高气温、最低气温、降水量、积雪深度、气象情况指示。该数据集提供了1......
  • 【剑指Offer刷题系列】序列化与反序列化二叉树
    目录问题描述示例示例1:示例2:示例3:示例4:提示思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度问题描述序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内......
  • 【剑指Offer刷题系列】数组中数字出现的次数 II
    目录问题描述示例示例1:示例2:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组actions,其中actions[i]表示做出该动作的人员......
  • 【剑指Offer刷题系列】整数拆分 II
    目录问题描述示例示例1:示例2:示例3:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述现需要将一根长度为正整数bamboo_len的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积......
  • 【剑指Offer刷题系列】数值的整数次方
    目录问题描述示例示例1:示例2:示例3:思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度结论问题描述实现pow(x,n),即计算x的n次幂函数(即,x^n)。注意:x是一个双精度浮点数。n是一个整数,可以是正数、负数或零......
  • 代码随想录 test1(二分详解,包括二分答案)
    一、二分查找关键:确定待查找的元素出现在什么区间内,循环不变量:目标值一定在当前搜索范围内。模板一:在左闭右闭区间内查找目标元素       由于待查找元素在左闭右闭区间,因此要想在已有数组内查找该元素,就要让初始左右指针分别为0,size-1(刚好覆盖整个数组)。   ......
  • AtCoder备赛刷题 ABC 361 | x = a^b
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】Howmanyintegersxx......