LeetCode 452. Minimum Number of Arrows to Burst Balloons

来源:互联网 发布:华西金手指软件下载 编辑:程序博客网 时间:2024/06/09 23:55

Description

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).

Solution

题意为:给定一些大小不等的气球,用区间范围来表示气球的大小,可能会有重叠区间,要求用最少的箭来将所有的气球打爆。因为局部最优解就等于全局最优解,故可应用贪婪算法。首先给区间排序,然后将箭数初始化为1,此箭能覆盖的最远位置就是第一个气球的结束点,用变量end来表示。接着开始遍历剩下的气球,如果当前气球的开始点小于等于end,说明跟之前的气球有重合,之前那一箭也可以打到当前的气球,此时将end的位置更新为两个气球结束点之间较小的那个,即当前气球和之前气球的重合点,然后继续看后面的气球;如果某个气球的起始点大于end了,说明前面的箭无法覆盖到当前的气球,则箭数加1,end设为当前气球的结束点。如此遍历得到最小箭数。

class Solution {public:    int findMinArrowShots(vector<pair<int, int>>& points) {        if (points.empty()) return 0;        sort(points.begin(), points.end());        int n_arr = 1, end = points[0].second;        for (int i = 1; i < points.size(); ++i) {            if (points[i].first <= end) {                end = min(end, points[i].second);            } else {                ++ n_arr;                end = points[i].second;            }        }        return n_arr;    }};
0 0