1. 程式人生 > 其它 >|NO.Z.00020|——————————|^^ 重要 ^^|——|CI/CD&Maven私服Nexus3.V01|---------------------------------------------|Nexus3概述|合理化上線方案|

|NO.Z.00020|——————————|^^ 重要 ^^|——|CI/CD&Maven私服Nexus3.V01|---------------------------------------------|Nexus3概述|合理化上線方案|

✅做題思路or感想

一刷的我對這道題頭痛不已,二刷的我一遍過,這種成就感是難以言說的。

而且這一次二刷的思路完全是根據自己的思路來設計的,我個人認為比Carl哥在書上寫的思路更加淺顯易懂。Carl哥在書上寫的這道題的思路太繞了,而且用了好多奇怪的知識去解。


思路

大體思路是用兩個變數startend來記錄合併區間的起點和終點(前閉後閉)。

  • 如果遍歷的當前區間可以合併,則更新startend
  • 如果不能合併,則把舊的合併區間放到result中,然後重新定義新的合併區間的初末位置
  • 如果根據上面的思路,最後一個區間在迴圈遍歷結束後也不會加入到result中,所以在迴圈結束後要手動把最後一個區間給加入到result

並且因為是要找重疊區域,則需要對原陣列進行排序,編寫排序的cmp規則也是這道題的難點之一啊

class Solution {
public:
	//編寫排序規則,注意力扣裡寫cmp要在前面加上static字首!
    static bool cmp(vector<int>& a, vector<int>& b) {
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        sort(intervals.begin(), intervals.end(), cmp);
        //定義兩個變數來記錄重疊區間
        int start = intervals[0][0], end = intervals[0][1];
        for (int i = 0; i < intervals.size(); i++) {
            //因為不重疊的情況比較少,所以if裡寫的是不重疊的情況,把
            //重疊的情況直接交給else,這也是寫程式碼的一種技巧吧
            if (end < intervals[i][0]) {
                //如果前後區間不重疊,則把前面重疊的區間放到result中
                //然後把後來者定義為新的重疊區間
                result.push_back(vector<int>{start, end});
                start = intervals[i][0];
                end = intervals[i][1];
            } else {
                //如果重疊,則要取並集!因為題目是要把兩個重疊區間給合併起來!!!
                start = min(start, intervals[i][0]);
                end = max(end, intervals[i][1]);
            }
        }
        //如果按照上面的邏輯,只有當前後區間不相同的時候才能把合併區間放到result裡
        //那麼必然會漏掉最後一個區間,所以這裡再把最後一個區間給新增上就可以了
        result.push_back(vector<int>{start, end});
        return result;
    }
};