zoukankan      html  css  js  c++  java
  • 0452用最少数量的箭引爆气球 Marathon

    在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。

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

    给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。

    示例 1:

    输入:points = [[10,16],[2,8],[1,6],[7,12]]
    输出:2
    解释:对于该样例,x = 6 可以射爆 [2,8],[1,6] 两个气球,以及 x = 11 射爆另外两个气球
    示例 2:

    输入:points = [[1,2],[3,4],[5,6],[7,8]]
    输出:4
    示例 3:

    输入:points = [[1,2],[2,3],[3,4],[4,5]]
    输出:2
    示例 4:

    输入:points = [[1,2]]
    输出:1
    示例 5:

    输入:points = [[2,3],[2,3]]
    输出:1

    提示:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons

    参考:

    python

    # 0452.最少数量箭射穿气球
    
    class Solution:
        def findMinArrowShots(self, points: [[int]]) -> int:
            """
            贪心算法,重叠的气球一箭射完
            思路:
            - 先排序,左边界小到大
            - 2.向后遍历气球,
                - 气球挨着,下个气球的左边界一定小于等于当前气球的右边界,一箭搞定
                - 气球不挨着,箭数量++, 此时更新气球的右边界
            :param points:
            :return:
            """
            if len(points) == 0: return 0
            points.sort(key=lambda x: x[0]) # 每个气球的左边界排序
            res = 1 # 至少需要一支箭
            for i in range(1,len(points)):
                if points[i][0] > points[i-1][1]: # 气球不挨着
                    res += 1
                else: # 挨着需要更新边界
                    points[i][1] = min(points[i-1][1], points[i][1])
            return res
    
    

    golang

    package greedy
    
    import "sort"
    
    // 贪心算法
    func findMinArrowShots(points [][]int) int {
    	var res int = 1
    	// 升序排列气球-左边界
    	sort.Slice(points, func(i, j int) bool {
    		return points[i][0] < points[j][0]
    	})
    	for i:=1;i<len(points);i++ {
    		if points[i][0] > points[i-1][1] { // 不挨着
    			res++
    		} else { // 挨着,更新边界
    			points[i][1] = min(points[i-1][1], points[i][1])
    		}
    	}
    	return res
    }
    
    func min(a,b int) int {
    	if a < b {
    		return a
    	}
    	return b
    }
    
  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/davis12/p/15605992.html
Copyright © 2011-2022 走看看