Leetcode 병합 간격 C ++

병합 간격

일련의 간격이 주어지면 모든 겹치는 간격을 병합하십시오.

예 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]는 겹치는 간격으로 간주 될 수 있습니다.


해결책 1 :

  • 우선 제목이 배열이 정렬되었음을 나타내지 않으므로 첫 번째 단계에서 정렬하고 첫 번째 오름차순에 따라 배열을 정렬하고 첫 번째가 같으면 두 번째 내림차순으로 정렬합니다.
  • 둘째, 원래 배열의 요소를 삭제하고 변경하는 데 너무 많은 시간이 걸리기 때문에 결과를 저장할 2 차원 배열과 삽입 할 데이터를 일시적으로 저장하는 1 차원 배열을 선언합니다.
  • 분류 되었기 때문에, 먼저 판단 할 때 간격의 하한이 다음 간격의 상한보다 크거나 같은지 판단합니다. 그렇다면 이때 두 간격이 반복되는 것으로 판단 할 수 있습니다. 그렇지 않으면 두 간격이 반복되지 않고 간격의 하한을 계속 판단합니다. 경계가 다음 간격의 하한보다 작은 지 여부는 두 간격이 교차하는 것을 의미하고 그렇지 않으면 간격에 포함됨을 의미합니다.
class Solution {
public:
    static bool cmp(const vector<int>&a,const vector<int>&b )
    {
        if(a[0]==b[0])
            return a[1]>b[1];
        return a[0]<b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.empty()) return intervals;
        vector<vector<int>> res;
        int count=0;
        sort(intervals.begin(),intervals.end(),cmp);
        vector<int> temp;
        temp.push_back(intervals[0][0]);
        temp.push_back(intervals[0][1]);
        res.push_back(temp);
        for(int i=1;i<intervals.size();i++)
        {
            if(res[count][1]>=intervals[i][0])
            {
                if(res[count][1]<=intervals[i][1])
                {
                    res[count][1]=intervals[i][1];
                }
            }
            else
            {
                count++;
                temp[0]=intervals[i][0];
                temp[1]=intervals[i][1];
                res.push_back(temp);
            }
        }
        return res;
    }
};

추천

출처blog.csdn.net/weixin_39139505/article/details/90215731