|NO.Z.00020|——————————|^^ 重要 ^^|——|CI/CD&Maven私服Nexus3.V01|---------------------------------------------|Nexus3概述|合理化上線方案|
阿新 • • 發佈:2022-03-28
✅做題思路or感想
一刷的我對這道題頭痛不已,二刷的我一遍過,這種成就感是難以言說的。
而且這一次二刷的思路完全是根據自己的思路來設計的,我個人認為比Carl哥在書上寫的思路更加淺顯易懂。Carl哥在書上寫的這道題的思路太繞了,而且用了好多奇怪的知識去解。
思路
大體思路是用兩個變數start
和end
來記錄合併區間的起點和終點(前閉後閉)。
- 如果遍歷的當前區間可以合併,則更新
start
和end
- 如果不能合併,則把舊的合併區間放到
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; } };