力扣算法题—056合并区间

Posted zzw1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣算法题—056合并区间相关的知识,希望对你有一定的参考价值。

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

  1 #include "000库函数.h"
  2 
  3 
  4  struct Interval {
  5      int start;
  6      int end;
  7      Interval() : start(0), end(0) {}
  8      Interval(int s, int e) : start(s), end(e) {}
  9  };
 10 
 11  //第一印象就是排序再组合合并
 12 //失败,因为给的范围不是按顺序的
 13 //class Solution {
 14 //public:
 15 //    vector<Interval> merge(vector<Interval>& intervals) {
 16 //        if (intervals.empty())return {};
 17 //        vector<Interval>res;
 18 //        Interval p;
 19 //        p.start = intervals[0].start;
 20 //        for (int i = 1; i < intervals.size(); ++i) {
 21 //            if ((intervals[i].start - intervals[i-1].end) < 1)
 22 //                continue;
 23 //            p.end = intervals[i-1].end;
 24 //            res.push_back(p);
 25 //            p.start = intervals[i].start;
 26 //        }
 27 //        p.end = intervals[intervals.size()-1].end;
 28 //        res.push_back(p);
 29 //        return res;
 30 //    }
 31 //};
 32 
 33 //仍然是先排序在合并的思想
 34 //但是改进了,将头尾分开排序
 35 //20ms
 36  class Solution {
 37  public:
 38      vector<Interval> merge(vector<Interval>& intervals) {
 39          if (intervals.empty())return {};
 40          vector<Interval>res;
 41          vector<int>s, e;
 42          for (int i = 0; i < intervals.size(); ++i) {
 43              s.push_back(intervals[i].start);
 44              e.push_back(intervals[i].end);
 45          }
 46          sort(s.begin(), s.end());//头排序
 47          sort(e.begin(), e.end());//尾排序
 48          Interval p;
 49          p.start = s[0];
 50          for (int i = 1; i < s.size(); ++i) {
 51              if ((s[i] - e[i - 1]) < 1)continue;//比较大小
 52              p.end = e[i - 1];
 53              res.push_back(p);
 54              p.start = s[i];
 55          }
 56          p.end = e[s.size() - 1];
 57          res.push_back(p);
 58          return res;
 59      }
 60  };
 61 
 62  //将上述方法改进,使用自定义排序函数
 63  class Solution {
 64  public:
 65      vector<Interval> merge(vector<Interval>& intervals) {
 66          if (intervals.empty()) return {};
 67          sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b) {return a.start < b.start; });
 68          vector<Interval> res{ intervals[0] };
 69          for (int i = 1; i < intervals.size(); ++i) {
 70              if (res.back().end < intervals[i].start) {
 71                  res.push_back(intervals[i]);
 72              }
 73              else {
 74                  res.back().end = max(res.back().end, intervals[i].end);
 75              }
 76          }
 77          return res;
 78      }
 79  };
 80 
 81 
 82 //这道题还有另一种解法,由于插入的过程中也有合并的操作,所以我们可以建立一个空的集合,
 83 //然后把区间集的每一个区间当做一个新的区间插入结果中,也可以得到合并后的结果,
 84 
 85  class Solution {
 86  public:
 87      vector<Interval> merge(vector<Interval>& intervals) {
 88          vector<Interval> res;
 89          for (int i = 0; i < intervals.size(); ++i) {
 90              res = insert(res, intervals[i]);
 91          }
 92          return res;
 93      }
 94      vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
 95          vector<Interval> res;
 96          int n = intervals.size(), cur = 0;
 97          for (int i = 0; i < n; ++i) {
 98              if (intervals[i].end < newInterval.start) {
 99                  res.push_back(intervals[i]);
100                  ++cur;
101              }
102              else if (intervals[i].start > newInterval.end) {
103                  res.push_back(intervals[i]);
104              }
105              else {
106                  newInterval.start = min(newInterval.start, intervals[i].start);
107                  newInterval.end = max(newInterval.end, intervals[i].end);
108              }
109          }
110          res.insert(res.begin() + cur, newInterval);
111          return res;
112      }
113  };
114 
115 
116 
117 void T056() {
118     Solution s;
119     vector<Interval>v;
120     vector<int>nums;
121     Interval p;
122     nums = { 1,3,2,6,8,10,15,18 };
123     for (int i = 0; i < nums.size(); i += 2) {
124         p.start = nums[i];
125         p.end = nums[i + 1];
126         v.push_back(p);
127     }
128     v = s.merge(v);
129     for (auto a : v)
130         cout << a.start << ", " << a.end << ";  ";
131     cout << endl;
132 
133     v.resize(0);
134     nums = { 1,4,4,5 };
135     for (int i = 0; i < nums.size(); i += 2) {
136         p.start = nums[i];
137         p.end = nums[i + 1];
138         v.push_back(p);
139     }
140     v = s.merge(v);
141     for (auto a : v)
142         cout << a.start << ", " << a.end << ";  ";
143     cout << endl;
144 
145     v.resize(0);
146     nums = { 1,4,0,4 };
147     for (int i = 0; i < nums.size(); i += 2) {
148         p.start = nums[i];
149         p.end = nums[i + 1];
150         v.push_back(p);
151     }
152     v = s.merge(v);
153     for (auto a : v)
154         cout << a.start << ", " << a.end << ";  ";
155     cout << endl;
156 
157 }

 

以上是关于力扣算法题—056合并区间的主要内容,如果未能解决你的问题,请参考以下文章

力扣算法JS LC [56. 合并区间] LC [738. 单调递增的数字]

精选力扣500题 第45题 LeetCode 56. 合并区间c++/java详细题解

力扣第56题 合并区间

算法刷题打卡

Java书签 #区间合并算法与实际业务应用

Java书签 #区间合并算法与实际业务应用