写在前面
本来是故意找的排序算法的题目,想练习一下排序算法。结果没想到C++的Algorithm库里面自带了容器迭代器的排序功能,于是我就拿来用了。之后我估计会开始深入地学习C++,那么这个排序算法等我研究了STL容器源码之后再回头来看看吧。
题目描述
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思考
其实逻辑非常简单,就是先将输入的二维数组按照头部的大小从小到大排序。排序之后,if (intervals[i + 1].front() <= intervals[i].back()) then merge(intervals[i + 1], intervals[i])
。
由于思路过于简单,我就不详细展开了。主要难点在于如何对容器数组进行排序,暂时我先不讨论这个内容,因为它涉及到迭代器的操作,这方面我还不太熟悉。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if (intervals.empty() || intervals.size() == 1)
return intervals;
else {
sort(intervals.begin(), intervals.end());
result.push_back(intervals.front());
}
for (auto &interval : intervals) {
if (interval.front() <= result.back().back())
interval.back() >= result.back().back() ? result.back().back() = interval.back()
: result.back().back() = result.back().back();
else
result.push_back(interval);
}
return result;
}
};
int main() {
vector<vector<int>> intervals = {{2, 3},
{4, 5},
{6, 7},
{8, 9},
{1, 10}};
Solution solution;
vector<vector<int>> result = solution.merge(intervals);
cout << result[0][0];
}
总结
没啥好总结的,迭代器指针和正常链表指针有什么区别呢,我先去研究一下下。