您的位置:首页 > 其它

算法设计与应用基础:第十周

2017-05-01 15:39 295 查看


452. Minimum Number of Arrows to Burst Balloons

Add to List

DescriptionHintsSubmissionsSolutions

Total Accepted: 10275
Total Submissions: 23657
Difficulty: Medium
Contributors:Leets4Eternity

There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided input is the start and end coordinates of the horizontal diameter. Since it's horizontal, y-coordinates don't
matter and hence the x-coordinates of start and end of the diameter suffice. Start is always smaller than end. There will be at most 104 balloons.
An arrow can be shot up exactly vertically from different points along the x-axis. A balloon with xstart and
xend bursts by an arrow shot at x if xstart ≤
x ≤ xend. There is no limit to the number of arrows that can be shot. An arrow once shot keeps travelling up infinitely. The problem is to find the
minimum number of arrows that must be shot to burst all balloons.
Example:
Input:
[[10,16], [2,8], [1,6], [7,12]]

Output:
2

Explanation:
One way is to shoot one arrow for example at x = 6 (bursting the balloons [2,8] and [1,6]) and another arrow at x = 11 (bursting the other two balloons).

题解:简单来说,这题就是有许多气球分布在x轴上,这些气球有重合部分,输入每个气球的范围对应的x坐标,问最少通过几次在某一位置射箭可以把所有的气球都弄爆。
最直接的思路就是尽量找重合的气球数最多的位置去射箭,但直接找并不好找。如果把所有气球按照end从小到大来排序,相等则按start来排,那么当我把箭射到第一个气球的end的位置的时候,一定是能射爆第一个气球的所有情况中能射掉气球数最多的情况之一。分两种情况来证明,若箭的位置左边有气球与当前气球的重合位置,则那个气球应该排在当前气球的前面,与当前气球是第一个气球矛盾;若箭的位置右边有气球,则这个气球与当前气球没有重合部分,无论如何也不可能同时爆。因此每次射每个气球的end的位置,当这个位置有其他气球重合,即下一个气球的start小于当前arrow位置时,同时射爆,直接跳到再下一个气球,按照这个思路一直下去,每次射箭计数,最后得到最小射箭数。代码如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: