贪心策略、排序
题目
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标
一支弓箭可以沿着 x
轴从不同点完全垂直地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 $x_{start},x_{end}$, 且满足 $x_{start} ≤ x ≤ x_{end}$,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points
,其中 $points [i] = [x_{start},x_{end}]$ ,返回引爆所有气球所必须射出的最小弓箭数。
示例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
提示
- $0<=points.length<=10^4$
- $points[i].length==2$
- $-2^{31}<=x_{start}<x_{end}<=2^{31}-1$
题解
方法一:排序+贪心
在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间
就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区
间。
具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选
择的区间不重叠的区间。
选择右排序,杜绝了前面一个包含后一个区间的情况。初始时,令每个气球都射一箭,当重叠时,总数n减一即可
1 | class Solution: |
1 | a =Solution() |
2