明日方舟愚人節活動63025分!(第一關)
阿新 • • 發佈:2022-04-02
✅做題思路or感想
這題亦是一道貪心(這種題目不明所裡的一看上去迷糊的一般都是貪心)
難點有二:
- 貪心策略
- 如何實現貪心的策略
貪心策略
這裡的策略倒是很簡單:只要射的箭都是往氣球最重合的地方射,所用的數量就會最少
實現策略
這裡為了讓氣球能夠重合,所以要對原陣列進行排序。難點在於如何對一個二維vector
排序呢(即是如何寫sort的cmp
呢)。
-
首先先明確,排序的規則是:對每個氣球的起始位置排序,即是對
point[i][0]
排序 -
而後便確定了程式碼
static bool cmp (vector<int>& a, vector<int>& b) { return a[0] < b[0]; }
-
這裡值得一說的是在力扣裡寫
cmp
,前面必須要加一個字首static
那如何確定氣球的最大重合區域呢?用兩個變數來表示就可以了
class Solution { public: //寫sort的cmp static bool cmp (vector<int>& a, vector<int>& b) { return a[0] < b[0]; } int findMinArrowShots(vector<vector<int>>& points) { //排序是找重合區間的條件 sort(points.begin(), points.end(), cmp); //用兩個變數來表示重合區間 //因為要用箭引爆氣球至少需要一支箭,所以這裡shotCount初始化為1 int shotStart = points[0][0], shotEnd = points[0][1], shotCount = 1; for (int i = 0; i < points.size(); i++) { //這裡的if,else很有講究,氣球重合的狀況有很多!但是不重合的狀況只有一種 //故這裡把簡單的寫在if中,複雜的直接交給else就好了 if (shotEnd < points[i][0]) { //如果前後氣球沒有交集 shotCount++; //把前面重合的氣球射爆 //重新定義重合區間(或者這裡說是瞄準區間更合理點?) shotStart = points[i][0]; shotEnd = points[i][1]; } else { //更新重合區間,取交集 shotStart = max(shotStart, points[i][0]); shotEnd = min(shotEnd, points[i][1]); } } return shotCount; } };