56. 合并区间 LeetCode(详细讲解 & 图示 & 注释)

原题地址:56. 合并区间 LeetCode
题目大意:给出若干个区间,合并重叠的区间,返回一个合并后的区间的集合。
思路解析:
56. 合并区间 LeetCode(详细讲解 & 图示 & 注释)_第1张图片

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
    	// 区间的个数
        int len = intervals.size();
        // 根据左边界大小快排
        quick_sort(intervals, 0, len - 1);
        // 结果集
        vector<vector<int>> ret;
        // 初始化区间[i, j]为第一个区间
        int i = intervals[0][0];
        int j = intervals[0][1];
        int k = 0;
        while (k < len)
        {
        	// k指向区间的左边界落在了i,j表示区间的范围内,且k指向区间的右边界大于j,更新j的值来合并区间
            if (intervals[k][0] >= i && intervals[k][0] <= j && intervals[k][1] > j)
            {
                j = intervals[k][1];
            }
            // k指向区间的右边界大于j,更新i,j表示区间为当前k所指向的区间,并把之前已合并好的区间[i, j]放入结果集
            else if (intervals[k][0] > j) 
            {
                vector<int> tmp;
                tmp.push_back(i);
                tmp.push_back(j);
                ret.push_back(tmp);
                i = intervals[k][0];
                j = intervals[k][1];
            }
            k++;
        }
        // 当访问到最后一个区间时,无论它与区间[i, j]是否可以合并,都没有被放入结果集,所以对于最后的区间单独处理
        vector<int> last;
        last.push_back(i);
        last.push_back(j);
        ret.push_back(last);
        return ret;
    }
	// 根据区间左边界的大小对所有区间进行从小到大的快速排序
    void quick_sort(vector<vector<int>>& intervals, int left, int right)
    {
        if (left >= right) return ;
        int l = left;
        int r = right;
        vector<int> key = intervals[l];
        while (l < r)
        {
            while (l < r && intervals[r][0] >= key[0]) r--;
            intervals[l] = intervals[r];
            while (l < r && intervals[l][0] <= key[0]) l++;
            intervals[r] = intervals[l];
        }
        intervals[l] = key;
        quick_sort(intervals, left, l - 1);
        quick_sort(intervals, l + 1, right);
    }
};

你可能感兴趣的:(LeetCode,leetcode,C++,区间合并,快速排序,算法)