合并区间
给出一个数组,每个元素是一个区间,题目要求将重叠的区间进行合并,首先我们根据区间的左顶点值进行排序,排序之后的区间,需要合并的一定相邻,在看完标准答案之后,我学会了对vectorback元素直接进行修改,程序代码如下,这里排序我使用了快速排序:
void quicksort(int left, int right, vector<vector>& intervals) { if(left >= right) return; int i, j, base, base_right,temp; i = left, j = right; base = intervals[left][0]; base_right = intervals[left][1]; while (i < j) { while (intervals[j][0] >= base && i < j) j--; while (intervals[i][0] <= base && i < j) i++; if(i < j) { temp = intervals[i][0]; intervals[i][0] = intervals[j][0]; intervals[j][0] = temp; temp = intervals[i][1]; intervals[i][1] = intervals[j][1]; intervals[j][1] = temp; } } intervals[left][0] = intervals[i][0]; intervals[left][1] = intervals[i][1]; intervals[i][0] = base; intervals[i][1] = base_right; quicksort(left, i - 1, intervals); quicksort(i + 1, right, intervals); } vector<vector> merge(vector<vector>& intervals) { if (intervals.size() == 0) { return {}; } quicksort(0, intervals.size()-1, intervals); vector<vector> merged; for (int i = 0; i < intervals.size(); ++i) { int L = intervals[i][0], R = intervals[i][1]; if (!merged.size() || merged.back()[1] < L) { merged.push_back({L, R}); } else { merged.back()[1] = max(merged.back()[1], R); } } return merged; }