区间问题 [start, end]
-
排序,start升序,end降序。
-
画图。
-
区间有几种情况:覆盖,相交、不相交
// 判断两个区间是否相交?
[s1,e1] [s2, e2] int start = max(s1, e1); int end = min(s2, e2); if (start <= end) { // 有交集 } // 1288.删除被覆盖区间 class Solution { public: static bool cmp(vector<int>& a, vector<int>& b) { if (a[0] != b[0]) { return a[0] < b[0]; } return a[1] > b[1]; } int removeCoveredIntervals(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), cmp); int start = intervals[0][0]; int end = intervals[0][1]; int count = -1; for (auto &it: intervals) { // 覆盖 if (start <= it[0] && end >= it[1]) { count++; } else if (end >= it[0]) { // 相交 end = max(end, it[1]); } else { start = it[0]; end = it[1]; } } return intervals.size() - count; } }; // 56.合并区间 class Solution { public: static bool cmp(vector<int>& a, vector<int>& b) { if (a[0] != b[0]) { return a[0] < b[0]; } return a[1] > b[1]; } vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), cmp); vector<vector<int>> ans; int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < intervals.size(); i++) { // 重叠,或者覆盖 if (end >= intervals[i][0]) { end = max(end, intervals[i][1]); } else { ans.push_back({start, end}); start = intervals[i][0]; end = intervals[i][1]; } } ans.push_back({start, end}); return ans; } }; // 986.区间列表的交集 class Solution { public: vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) { vector<vector<int>> ans; int i = 0; int j = 0; while (i < firstList.size() && j < secondList.size()) { // 求交集,小技巧 int start = max(firstList[i][0], secondList[j][0]); int end = min(firstList[i][1], secondList[j][1]); if (start <= end) { ans.push_back({start, end}); } // 需要注意指针的移动 if (firstList[i][1] < secondList[j][1]) { i++; } else { j++; } } return ans; } };