Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Leetcode 452. Minimum Number of Arrows to Burst Balloons

Woodyiiiiiii opened this issue · comments

这道题是intervals区间合并的问题。因为我发现类似的区间合并题目都可以用这个做法,所以记录下来。

步骤:

  1. 排序,按从小到大对intervals排序(注意因为直接用Arrays.sort内部的相减的时候,可能会出现爆栈的情况,所以这里我用long做了处理)
  2. 循环遍历,用两个变量来代表上个重叠区间。判断当前区间是否跟下一个区间overlap重叠,是的话则记录重叠区间,到下次循环里判断是否继续重叠,以此作为重叠连续区间的判断;否则继续。
class Solution {
    public int findMinArrowShots(int[][] points) {
        // sort points, first by start, then by end
        // prevent exceeding integer limit
        Arrays.sort(points, (a, b) -> {
            if (a[0] != b[0]) return ((long)(a[0]) - b[0]) > 0 ? 1 : -1;
            return ((long)(a[1]) - b[1]) > 0 ? 1 : -1;
        });

        int l = 0, r = 0;
        int ans = 0;
        for (int i = 0; i < points.length; ++i) {
            if (l == 0 && r == 0) {
                if (i < points.length - 1 && points[i][1] >= points[i + 1][0]) {
                    l = points[i + 1][0];
                    r = Math.min(points[i][1], points[i + 1][1]);
                    ++i;
                }
                ++ans;
            } else {
                if (l >= points[i][0] || r >= points[i][0]) {
                    l = Math.max(l, points[i][0]);
                    r = Math.min(points[i][1], r);
                } else {
                    --i;
                    l = 0;
                    r = 0;
                }
            }
        }

        return ans;
    }
}

intervals类型题目如下,并不难,大部分都是medium难度。


类似的intervals类型题目: