LeetCode 452. Minimum Number of Arrows to Burst Balloons Sort/Medium

押切徹發表於2020-11-26


1.Description

There are some 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. The start is always smaller than the end.

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 traveling up infinitely.

Given an array points where points[i] = [xstart, xend], return the minimum number of arrows that must be shot to burst all balloons.

2.Example

Input: points = [[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).

3.Solution

按照右邊界從小到大排序後,第一箭想要射中儘量多的氣球,就取第一個氣球的右邊界,如果之後的氣球的左邊界小於第一個球的右邊界說明被射爆,就在迴圈中跳過。然後按這樣的思想一直遍歷。
一般的重寫comparator是使用下列(交換相減的順序能控制從大到小還是從小到大):
1.匿名內部類:
在這裡插入圖片描述
2.使用Lambda表示式簡化匿名內部類:
在這裡插入圖片描述
3.簡化省略lambda:
在這裡插入圖片描述
而這裡的有一個特殊測試用例[[-2147483646,-2147483645],[2147483646,2147483647]]因此需要改一下。

class Solution {
        public int findMinArrowShots(int[][] points) {
        //邊界條件判斷
        if (points == null || points.length == 0)
            return 0;
        //按照每個氣球的右邊界排序
        Arrays.sort(points, (a, b) -> a[1] > b[1] ? 1 : -1);
        //獲取排序後第一個氣球右邊界的位置,我們可以認為是箭射入的位置
        int last = points[0][1];
        //統計箭的數量
        int count = 1;
        for (int i = 1; i < points.length; i++) {
            //如果箭射入的位置小於下標為i這個氣球的左邊位置,說明這支箭不能
            //擊爆下標為i的這個氣球,需要再拿出一支箭,並且要更新這支箭射入的
            //位置
            if (last < points[i][0]) {
                last = points[i][1];
                count++;
            }
        }
        return count;
    }
}

相關文章