首页 > 其他 > 详细

20.07.21 LeetCode435. 无重叠区间

时间:2020-07-21 15:43:20      阅读:52      评论:0      收藏:0      [点我收藏+]
 1 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
 2 
 3 注意:
 4 
 5 可以认为区间的终点总是大于它的起点。
 6 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
 7 示例 1:
 8 
 9 输入: [ [1,2], [2,3], [3,4], [1,3] ]
10 
11 输出: 1
12 
13 解释: 移除 [1,3] 后,剩下的区间没有重叠。
14 示例 2:
15 
16 输入: [ [1,2], [1,2], [1,2] ]
17 
18 输出: 2
19 
20 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
21 示例 3:
22 
23 输入: [ [1,2], [2,3] ]
24 
25 输出: 0
26 
27 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
28 
29 来源:力扣(LeetCode)
30 链接:https://leetcode-cn.com/problems/non-overlapping-intervals
31 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

  贪心算法策略。要达到目的就要优先保留结尾小且不相交的区间,因为这样才能保证余留给其他区间的空间更大,能够保留更多区间。为此我们先将数组按区间尾升序排列,以最小的区间尾为起点,每次与后一个的区间头相比,如果后一个的区间头小于上一个的区间尾则证明两个区间存在重叠,舍弃该区间,否则保留,并以当前新区间尾与后一个区间头进行比较,依次进行。

  特别要提的是本题题解并不完美,仅为练习贪心算法做下记录。

实现代码:

 1 class Solution {
 2 public:
 3     int eraseOverlapIntervals(vector<vector<int>>& intervals) {
 4         if(intervals.empty())
 5             return 0;
 6         //先将区间数组按区间尾升序排序
 7         sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b){return a[1]<b[1];});
 8         int total = 0;int pre = intervals[0][1];
 9         for(int i = 1;i<intervals.size();++i)
10         {
11             if(intervals[i][0]<pre)
12                 total++;
13             else
14                 pre = intervals[i][1];
15         }
16         return total;
17     }
18 };

 

20.07.21 LeetCode435. 无重叠区间

原文:https://www.cnblogs.com/pionice/p/13354310.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!