19、合并区间
题目
19.0、暴力解法
对每一个区间都进行和其他区间比较,最后筛选不重复集合即可
- 时间复杂度:O(n平方)
- 空间复杂度:O(1)不考虑答案占用空间
19.1、对子数组进行排序
按照子数组的第一个数字对大数组进行排序,然后就可以通过简单的判断来进行合并数组
vector<vector<int>> merge1(vector<vector<int>>& intervals)
{
int size = intervals.size();
if (size == 1)return intervals;
sort(intervals.begin(), intervals.end()); //根据小数组的第一个数对大数组进行排序
vector<vector<int>> result;
vector<int> partResult;
for (int i = 0; i < size; i++)
{
if (partResult.empty())
{
partResult = intervals[i];
continue;
}
else
{
if (partResult[1] >= intervals[i][0] && partResult[1] < intervals[i][1])
partResult[1] = intervals[i][1];
else if (partResult[1] < intervals[i][0])
{
result.push_back(partResult);
partResult = intervals[i];
}
}
}
if (!partResult.empty())result.push_back(partResult);
return result;
}
- 时间复杂度:O(k log k)对子数组进行排序的开销
- 空间复杂度:O(1)不考虑答案占用空间
19.2、代码简化
上面的代码写得太烂了,这里简化一下
vector<vector<int>> merge2(vector<vector<int>>& intervals)
{
if (intervals.empty())return intervals;
sort(intervals.begin(), intervals.end());
vector<vector<int>> result;
for (size_t i = 0; i < intervals.size(); i++)
{
int leftNum = intervals[i][0], rightNum = intervals[i][1];
if (result.empty() || leftNum > result.back()[1])
result.push_back({ leftNum,rightNum });
else
result.back()[1] = max(result.back()[1], rightNum);
}
return result;
}
- 时间复杂度:O(k log k)对子数组进行排序的开销
- 空间复杂度:O(1)不考虑答案占用空间