435. 无重叠区间(贪心算法)

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return 0;
        }
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 按照左边界进行排序
        int count = 0; // 记录需要移除的区间数量
        int end = intervals[0][1]; // 记录当前区间的结束位置
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < end) { // 如果当前区间和前一个区间重叠了
                count++; // 需要移除一个区间
                end = Math.min(end, intervals[i][1]); // 移除结束位置比较靠后的那个区间
            } else {
                end = intervals[i][1]; // 更新当前区间的结束位置
            }
        }
        return count;
    }
}

452. 用最少数量的箭引爆气球(贪心算法)

Untitled

贪心算法,找最好的右边界。

class Solution {
    public int findMinArrowShots(int[][] points) {
        int n = points.length;
        Arrays.sort(points, (a, b) -> a[0] > b[0] ? 1 : -1);
        long end = points[0][1];

        int ans = 1;
        for(int i = 1; i < n; i++) {
            if(end >= points[i][0]) {
                // 记得更新最小右区间
                end = Math.min(points[i][1], end);
                continue;
            }else {
                end = points[i][1];
                ans++;
            }
        }
        return ans;
    }
}