思路按照區間的左端點,右端點從小道大排序。遍歷每乙個區間,若當前區間curr.start <= last.end,證明區間有可能有交集,需要更新上乙個區間last.end的值。若curr.start > last.end 證明兩個區間不可能有交集。
#include #include #include using namespace std;
struct record ;
bool cmp(record a, record b)
else
}class solution
record* rec = new record[n];
for (int i = 0; i < n; i++)
sort(rec, rec + n, cmp);
record* ans = new record[n];
int k = 0;
ans[k].left = rec[k].left;
ans[k].right = rec[k].right;
for (int curr = 1; curr < n; curr++)
else if (ans[k].right < rec[curr].left)
}vector < vector>* ans_vc = new vector < vector>;
for (int i = 0; i <= k; i++)
return *ans_vc;
}};
2.剩下的樹
#include #include #include using namespace std;
struct node
;bool cmp(node a, node b)
else
}int main()
sort(rec, rec + m, cmp);
vectorvc;
node temp;
temp.left = rec[0].left;
temp.right = rec[0].right;
vc.push_back(temp);
for (int curr = 1; curr < m; curr++)
else if(rec[curr].left>vc[last].right)
} int ans = (n + 1);
for (int i = 0; i < vc.size(); i++)
cout << ans << endl;
} //fclose(stdin);
}
區間排程之區間合併問題
還是先看一道題 一 解題思路 乙個區間可以表示為 start,end 區間重疊區間排程問題,需要按 end 排序,以便滿足貪心選擇性質。而對於區間合併問題,其實按 end 和 start 排序都可以,不過為了清晰起見,我們選擇按 start 排序。顯然,對於幾個相交區間合併後的結果區間 x,x.st...
區間排程問題之區間合併
上篇文章用貪心演算法解決了區間排程問題 給你很多區間,讓你求其中的最大不重疊子集。我們解決區間問題的一般思路是先排序,然後觀察規律。乙個區間可以表示為 start,end 前文聊的區間排程問題,需要按end排序,以便滿足貪心選擇性質。而對於區間合併問題,其實按end和start排序都可以,不過為了清...
區間排程之區間交集問題
區間排程問題共寫了3片部落格,前兩篇重疊區間和區間合併分別講了區間的最大不相交子集和重疊區間的合併,今天再寫乙個演算法,可以快速找出兩組區間的交集。一 解題思路 解決區間問題的思路一般是先排序,以便操作,不過題目說已經排好序了,那麼可以用兩個索引指標在 a 和 b 中游走,把交集找出來,大概是這樣的...