leetcode 435 无重叠区间

超、凢脫俗 2022-09-15 05:51 308阅读 0赞

前言

题目:435. 无重叠区间

参考题解:无重叠区间-代码随想录


提交代码

方法一:起点排序

之前做过leetcode 452 用最少数量的箭引爆气球,我们很自然想到,将所有的区间按照起点进行排序。

之后,需要找到移除区间的最小数量,使剩余区间互不重叠。

贪心思路:当已排序的两个区间重叠时,必然要删除一个。删除区间终点较大的区间,可以为后面区间腾出空间,以保证移除最少区间。

  1. class Solution {
  2. public:
  3. struct cmp{
  4. bool operator() (vector<int>& v1, vector<int>& v2){
  5. // 第一个元素越小越靠前;第一个元素相等,第二个元素越大越靠前,保证屁股越长,越容易被删除
  6. if(v1[0]<v2[0])
  7. return true;
  8. else if(v1[0]==v2[0])
  9. return v1[1]>v2[1];
  10. else
  11. return false;
  12. }
  13. };
  14. int eraseOverlapIntervals(vector<vector<int>>& intervals) {
  15. if(intervals.size()==0 || intervals.size()==1)
  16. return 0;
  17. sort(intervals.begin(),intervals.end(),cmp());
  18. int count = 0; // 需要被删除的区间
  19. int end = intervals[0][1];
  20. for(int i=1; i<intervals.size(); i++){
  21. if(intervals[i][0] < end){ // 存在相交,必然要删除一个,选择删除屁股比较长的那个
  22. count++;
  23. end = min(end,intervals[i][1]); // 保留屁股较短的那个==删除屁股较长的那个
  24. continue;
  25. }
  26. end = intervals[i][1]; // 使用最新的一个屁股作为end
  27. }
  28. return count;
  29. }
  30. };

方法二:终点排序

下面思路和代码来自参考题解。

贪心思路:使用每个区间的终点进行排序。每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大)

这个方法不太容易想到。

  1. class Solution {
  2. public:
  3. // 按照区间右边界排序
  4. static bool cmp (const vector<int>& a, const vector<int>& b) {
  5. return a[1] < b[1];
  6. }
  7. int eraseOverlapIntervals(vector<vector<int>>& intervals) {
  8. if (intervals.size() == 0) return 0;
  9. sort(intervals.begin(), intervals.end(), cmp);
  10. int count = 1; // 记录非交叉区间的个数
  11. int end = intervals[0][1]; // 记录区间分割点
  12. for (int i = 1; i < intervals.size(); i++) {
  13. if (end <= intervals[i][0]) {
  14. end = intervals[i][1];
  15. count++;
  16. }
  17. }
  18. return intervals.size() - count;
  19. }
  20. };

总的来说,方法二简单点,但是不容易想到。方法一在原来思维的基础上,稍加改变,便可以想到。

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 435.重叠区间(java 贪心)

    d先根据各区间尾节点进行从小到大排序,然后依次判断下一个区间的开始节点是否大于上一个区间的结束节点,若大于,可留住,若是小于,则发生重叠,删去。这样就能保证尾节点小的留住,为后

    相关 leetcode435重叠空间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 \[1,2\] 和 \[2,3\] 的边界相互