给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5] 输出: [[1,5],[6,9]]
示例 2:
输入: intervals =[[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval =[4,8]
输出: [[1,2],[3,10],[12,16]] 解释: 这是因为新的区间[4,8]
与[3,5],[6,7],[8,10]
重叠。
1 #include "000库函数.h" 2 3 4 5 struct Interval { 6 int start; 7 int end; 8 Interval() : start(0), end(0) {} 9 Interval(int s, int e) : start(s), end(e) {} 10 }; 11 12 //与上题合并区间没什么区别 13 //只不过将区间加入进去而已 14 15 class Solution { 16 public: 17 vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { 18 if (intervals.empty())return { newInterval }; 19 vector<Interval>res; 20 vector<int>s, e; 21 for (int i = 0; i < intervals.size(); ++i) { 22 s.push_back(intervals[i].start); 23 e.push_back(intervals[i].end); 24 } 25 s.push_back(newInterval.start); 26 e.push_back(newInterval.end); 27 sort(s.begin(), s.end());//头排序 28 sort(e.begin(), e.end());//尾排序 29 Interval p; 30 p.start = s[0]; 31 for (int i = 1; i < s.size(); ++i) { 32 if ((s[i] - e[i - 1]) < 1)continue;//比较大小 33 p.end = e[i - 1]; 34 res.push_back(p); 35 p.start = s[i]; 36 } 37 p.end = e[s.size() - 1]; 38 res.push_back(p); 39 return res; 40 } 41 }; 42 43 44 //题目中确保原来的区间是按起始端且无重叠,则复杂度较上题更小 45 class Solution { 46 public: 47 vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { 48 vector<Interval> res; 49 int n = intervals.size(), cur = 0; 50 while (cur < n && intervals[cur].end < newInterval.start) { 51 res.push_back(intervals[cur++]); 52 } 53 while (cur < n && intervals[cur].start <= newInterval.end) { 54 newInterval.start = min(newInterval.start, intervals[cur].start); 55 newInterval.end = max(newInterval.end, intervals[cur].end); 56 ++cur; 57 } 58 res.push_back(newInterval); 59 while (cur < n) { 60 res.push_back(intervals[cur++]); 61 } 62 return res; 63 } 64 }; 65 66 67 68 69 70 71 void T057() { 72 Solution s; 73 vector<Interval>v; 74 Interval newInterval; 75 vector<int>nums; 76 Interval p; 77 nums = { 1,4,8,10 }; 78 for (int i = 0; i < nums.size(); i += 2) { 79 p.start = nums[i]; 80 p.end = nums[i + 1]; 81 v.push_back(p); 82 } 83 newInterval.start = 5; 84 newInterval.end = 7; 85 v = s.insert(v, newInterval); 86 for (auto a : v) 87 cout << a.start << ", " << a.end << "; "; 88 cout << endl; 89 90 v.clear(); 91 nums = { 1,4,8,10 }; 92 for (int i = 0; i < nums.size(); i += 2) { 93 p.start = nums[i]; 94 p.end = nums[i + 1]; 95 v.push_back(p); 96 } 97 newInterval.start = 3; 98 newInterval.end = 5; 99 v = s.insert(v, newInterval); 100 for (auto a : v) 101 cout << a.start << ", " << a.end << "; "; 102 cout << endl; 103 104 v.clear(); 105 nums = { 1,4,8,10 }; 106 for (int i = 0; i < nums.size(); i += 2) { 107 p.start = nums[i]; 108 p.end = nums[i + 1]; 109 v.push_back(p); 110 } 111 newInterval.start = 0; 112 newInterval.end = 7; 113 v = s.insert(v, newInterval); 114 for (auto a : v) 115 cout << a.start << ", " << a.end << "; "; 116 cout << endl; 117 118 v.clear(); 119 nums = { 1,4,8,10 }; 120 for (int i = 0; i < nums.size(); i += 2) { 121 p.start = nums[i]; 122 p.end = nums[i + 1]; 123 v.push_back(p); 124 } 125 newInterval.start = 2; 126 newInterval.end = 9; 127 v = s.insert(v, newInterval); 128 for (auto a : v) 129 cout << a.start << ", " << a.end << "; "; 130 cout << endl; 131 132 133 }