阅读量:0
给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: intervals = [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: intervals = [ [1,2], [2,3] ] 输出: 0 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
方法一:(可能会导致超时)使用动态规划
先将原数组按照左端点排序,用一个数组f[i]表示以第i个区间为最后一个区间的最多的不重叠区间个数。
class Solution { public int eraseOverlapIntervals(int[][] intervals) { if (intervals.length == 0) { return 0; } Arrays.sort(intervals, new Comparator<int[]>() { public int compare(int[] interval1, int[] interval2) { return interval1[0] - interval2[0]; } }); int n = intervals.length; int[] f = new int[n]; Arrays.fill(f, 1); for (int i = 1; i < n; ++i) { for (int j = 0; j < i; ++j) { if (intervals[j][1] <= intervals[i][0]) { f[i] = Math.max(f[i], f[j] + 1); } } } return n - Arrays.stream(f).max().getAsInt(); } } 作者:力扣官方题解 链接:https://leetcode.cn/problems/non-overlapping-intervals/solutions/541543/wu-zhong-die-qu-jian-by-leetcode-solutio-cpsb/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:使用贪心算法
先将原数组按照右端点排序, 设第一个区间为满足不重叠条件的最后一个区间,然后从第一个区间开始往后移动,如果后面的区间不与这个区间重叠,就把后一个区间作为满足不重叠条件的最后一个区间。
class Solution { public int eraseOverlapIntervals(int[][] intervals) { int n=intervals.length; if(n==0){ return 0; } Arrays.sort(intervals, new Comparator<int[]>() { @Override public int compare(int[] intervals1, int[] intervals2) { return intervals1[1]-intervals2[1]; } }); int ans=1; int right=intervals[0][1]; for(int i=1;i<n;i++){ if(intervals[i][0]>=right){ right=intervals[i][1]; ans++; } } return n-ans; } }