每日一题.452. 用最少数量的箭引爆气球

在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。

我的解法:首先按照区间的右边界从小到大排序区间,然后以区间的右边界为弓箭射出的坐标cur,若cur大于等于point[i][0],说明当前箭可以引爆第i个气球;若cur小于point[j][0],说明当前箭无法引爆第j个气球,则将总箭数+1,并将point[j][1]作为下一支箭射出的坐标,继续判断直到所有区间都判断完。

时间复杂度:O(n),空间复杂度:O(1)

class Solution {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0) {
            return 0;
        }
        int len = points.length, res = 1;
        /*按右边界从小到大排序数组*/
        Arrays.sort(points, (o1, o2) -> {
            return o1[1] > o2[1] ? 1 : -1; 
        });
        /*第一支箭(箭的位置只可能出现在区间的右边界)*/
        int cur = points[0][1];
        for (int i = 1; i < len; i++) {
            /*若cur小于point[i][0]说明当前箭无法引爆第i个气球*/
            if (cur < points[i][0]) {
                res += 1;
                cur = points[i][1];
            }
        }
        return res;
    }
}

你可能感兴趣的:(每日一题.452. 用最少数量的箭引爆气球)