程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [LeetCode]56.Merge Intervals

[LeetCode]56.Merge Intervals

編輯:C++入門知識

[LeetCode]56.Merge Intervals


【題目】

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

【分析】

(1)先將目標區間數組按X軸從小到大排序。例如:[2,3] [1,2] [3,9] ->[1,2] [2,3] [3,9]

(2)掃描排序後的目標區間數組,將這些區間合並成若干個互不相交的區間。例如 [2,3] [1,2] [4,9] ->[1,3] [4,9]

這裡分三種情況:

a:[1,3] [2,6] -> [1,6] 第一個區間的end大於等於第二個區間的start,同時第二個區間的end大於第一個區間的end

b:[1,7] [2,4] -> [1,7] 第一個區間的end大於等於第二個區間的start,同時第二個區間的end小於第一個區間的end

c:[1,2] [3,4] -> [1,2] [3,4] 第一個區間的end小於第二個區間的start

【代碼】

/*********************************
*   日期:2015-01-14
*   作者:SJF0115
*   題目: 56.Merge Intervals
*   網址:https://oj.leetcode.com/problems/merge-intervals/
*   結果:AC
*   來源:LeetCode
*   博客:
**********************************/
#include 
#include 
#include 
using namespace std;

struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

class Solution {
public:
    // 比較函數
    static bool cmp(const Interval& ina,const Interval& inb){
        return ina.start < inb.start;
    }
    vector merge(vector &intervals) {
        vector result;
        int count = intervals.size();
        if(count <= 1){
            return intervals;
        }//if
        // x軸排序
        sort(intervals.begin(),intervals.end(),cmp);
        // 合並
        result.push_back(intervals[0]);
        // 考慮3種情況
        for(int i = 1;i < count;i++){
            Interval preIn = result.back();
            Interval curIn = intervals[i];
            // [1,3] [2,6]
            if(curIn.start <= preIn.end && curIn.end > preIn.end){
                   preIn.end = curIn.end;
                   result.pop_back();
                   result.push_back(preIn);
            }//if
            // [1,2] [3,4]
            else if(curIn.start > preIn.end){
                result.push_back(curIn);
            }
            // [1,7] [2,3] 不用做任何事
        }//for
        return result;
    }
};

int main(){
    Solution solution;
    Interval in1(1,2);
    Interval in2(4,6);
    Interval in3(8,10);
    Interval in4(15,18);

    vector vec;
    vec.push_back(in1);
    vec.push_back(in2);
    vec.push_back(in3);
    vec.push_back(in4);
    // 合並
    vector v = solution.merge(vec);
    // 輸出
    for(int i = 0;i < v.size();i++){
        Interval in = v[i];
        cout<<"["<


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved