合并区间
给出一个数组,每个元素是一个区间,题目要求将重叠的区间进行合并,首先我们根据区间的左顶点值进行排序,排序之后的区间,需要合并的一定相邻,在看完标准答案之后,我学会了对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;
}

浙公网安备 33010602011771号