day35 | 貪心4

0.引言

● 860.檸檬水找零
● 406.根據(jù)身高重建隊列
● 452. 用最少數(shù)量的箭引爆氣球

860.# 檸檬水找零

Category Difficulty Likes Dislikes
algorithms Easy (58.55%) 436 -

在檸檬水攤上缕题,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產(chǎn)品胖腾,(按賬單 bills 支付的順序)一次購買一杯烟零。

每位顧客只買一杯檸檬水瘪松,然后向你付 5 美元、10 美元或 20 美元锨阿。你必須給每個顧客正確找零宵睦,也就是說凈交易是每位顧客向你支付 5 美元。

注意墅诡,一開始你手頭沒有任何零錢壳嚎。

給你一個整數(shù)數(shù)組 bills ,其中 bills[i] 是第 i 位顧客付的賬书斜。如果你能給每位顧客正確找零诬辈,返回 true ,否則返回 false 荐吉。

示例 1:

輸入:bills = [5,5,5,10,20]
輸出:true
解釋:
前 3 位顧客那里焙糟,我們按順序收取 3 張 5 美元的鈔票。
第 4 位顧客那里样屠,我們收取一張 10 美元的鈔票穿撮,并返還 5 美元。
第 5 位顧客那里痪欲,我們找還一張 10 美元的鈔票和一張 5 美元的鈔票悦穿。
由于所有客戶都得到了正確的找零,所以我們輸出 true业踢。

示例 2:

輸入:bills = [5,5,10,10,20]
輸出:false
解釋:
前 2 位顧客那里栗柒,我們按順序收取 2 張 5 美元的鈔票。
對于接下來的 2 位顧客知举,我們收取一張 10 美元的鈔票瞬沦,然后返還 5 美元。
對于最后一位顧客雇锡,我們無法退回 15 美元逛钻,因為我們現(xiàn)在只有兩張 10 美元的鈔票。
由于不是每位顧客都得到了正確的找零锰提,所以答案是 false曙痘。

提示:

  • 1 <= bills.length <= 10<sup>5</sup>
  • bills[i] 不是 5 就是 10 或是 20

Discussion | Solution

這個正常的邏輯思路:

/*
 * @lc app=leetcode.cn id=860 lang=cpp
 *
 * [860] 檸檬水找零
 *
 * 追蹤手頭有多少張 5 美元和 10
 * 美元的鈔票。對于每位顧客立肘,我們根據(jù)他們支付的鈔票類型進行如下操作:
 * - 1.如果顧客支付 5 美元边坤,我們將其添加到手頭的鈔票中。
 * - 2.如果顧客支付 10 美元谅年,我們需要找回一張 5 美元的鈔票惩嘉。如果沒有 5
 * 美元的鈔票,返回 false踢故。否則文黎,將手頭的 5 美元鈔票減少一張惹苗,并添加一張 10
 * 美元鈔票。
 * - 3.如果顧客支付 20 美元耸峭,我們可以找回一張 10 美元和一張 5
 * 美元的鈔票桩蓉,或者找回三張 5 美元的鈔票。如果沒有足夠的零錢劳闹,返回 false院究。
 */

// @lc code=start
class Solution {
 public:
  bool lemonadeChange(vector<int>& bills) {
    int five = 0, ten = 0;

    for (int bill : bills) {
      if (bill == 5) {
        five++;
      } else if (bill == 10) {
        if (five == 0) {
          return false;
        }
        five--;
        ten++;
      } else {  // bill == 20
        if (ten > 0 && five > 0) {
          ten--;
          five--;
        } else if (five >= 3) {
          five -= 3;
        } else {
          return false;
        }
      }
    }

    return true;
  }
};
// @lc code=end

406.# 根據(jù)身高重建隊列

Category Difficulty Likes Dislikes
algorithms Medium (76.16%) 1590 -

假設有打亂順序的一群人站成一個隊列,數(shù)組 people 表示隊列中一些人的屬性(不一定按順序)本涕。每個 people[i] = [h<sub>i</sub>, k<sub>i</sub>] 表示第 i 個人的身高為 h<sub>i</sub> 业汰,前面 正好k<sub>i</sub>個身高大于或等于 h<sub>i</sub> 的人。

請你重新構造并返回輸入數(shù)組 people 所表示的隊列菩颖。返回的隊列應該格式化為數(shù)組 queue 样漆,其中 queue[j] = [h<sub>j</sub>, k<sub>j</sub>] 是隊列中第 j 個人的屬性(queue[0] 是排在隊列前面的人)。

示例 1:

輸入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
輸出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解釋:
編號為 0 的人身高為 5 晦闰,沒有身高更高或者相同的人排在他前面放祟。
編號為 1 的人身高為 7 ,沒有身高更高或者相同的人排在他前面呻右。
編號為 2 的人身高為 5 跪妥,有 2 個身高更高或者相同的人排在他前面,即編號為 0 和 1 的人声滥。
編號為 3 的人身高為 6 眉撵,有 1 個身高更高或者相同的人排在他前面,即編號為 1 的人落塑。
編號為 4 的人身高為 4 纽疟,有 4 個身高更高或者相同的人排在他前面,即編號為 0芜赌、1仰挣、2伴逸、3 的人缠沈。
編號為 5 的人身高為 7 ,有 1 個身高更高或者相同的人排在他前面减宣,即編號為 1 的人拐揭。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新構造后的隊列夫否。

示例 2:

輸入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
輸出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]

提示:

  • 1 <= people.length <= 2000
  • 0 <= h<sub>i</sub> <= 10<sup>6</sup>
  • 0 <= k<sub>i</sub> < people.length
  • 題目數(shù)據(jù)確保隊列可以被重建

Discussion | Solution

貪心思想

  • 局部最優(yōu):優(yōu)先按身高高的people的k來插入。插入操作過后的people滿足隊列屬性

  • 全局最優(yōu):最后都做完插入操作柬赐,整個隊列滿足題目隊列屬性

image.png
/*
 * @lc app=leetcode.cn id=406 lang=cpp
 *
 * [406] 根據(jù)身高重建隊列
 */

// @lc code=start
class Solution {
 public:
  vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
    sort(people.begin(), people.end(),
         [](const vector<int>& a, const vector<int>& b) {
           return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
         });

    std::vector<std::vector<int>> result;

    for (const auto& p : people) {
      result.insert(result.begin() + p[1], p);
    }

    return result;
  }
};
// @lc code=end

452. # 用最少數(shù)量的箭引爆氣球

Category Difficulty Likes Dislikes
algorithms Medium (50.75%) 763 -

有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數(shù)數(shù)組 points 官紫,其中points[i] = [x<sub>start</sub>, x<sub>end</sub>] 表示水平直徑在 x<sub>start</sub>x<sub>end</sub>之間的氣球肛宋。你不知道氣球的確切 y 坐標州藕。

一支弓箭可以沿著 x 軸從不同點 完全垂直 地射出。在坐標 x 處射出一支箭酝陈,若有一個氣球的直徑的開始和結(jié)束坐標為 xstart床玻,xend 且滿足 x<sub>start</sub> ≤ x ≤ xend沉帮,則該氣球會被 引爆 锈死。可以射出的弓箭的數(shù)量 沒有限制 。 弓箭一旦被射出之后穆壕,可以無限地前進待牵。

給你一個數(shù)組 points ,*返回引爆所有氣球所必須射出的 最小 弓箭數(shù) *喇勋。

示例 1:

輸入:points = [[10,16],[2,8],[1,6],[7,12]]
輸出:2
解釋:氣球可以用2支箭來爆破:
-在x = 6處射出箭缨该,擊破氣球[2,8]和[1,6]。
-在x = 11處發(fā)射箭茄蚯,擊破氣球[10,16]和[7,12]压彭。

示例 2:

輸入:points = [[1,2],[3,4],[5,6],[7,8]]
輸出:4
解釋:每個氣球需要射出一支箭,總共需要4支箭渗常。

示例 3:

輸入:points = [[1,2],[2,3],[3,4],[4,5]]
輸出:2
解釋:氣球可以用2支箭來爆破:
- 在x = 2處發(fā)射箭壮不,擊破氣球[1,2]和[2,3]。
- 在x = 4處射出箭皱碘,擊破氣球[3,4]和[4,5]询一。

提示:

  • 1 <= points.length <= 10<sup>5</sup>
  • points[i].length == 2
  • -2<sup>31</sup> <= x<sub>start</sub> < x<sub>end</sub> <= 2<sup>31</sup> - 1

Discussion | Solution

貪心思想

/*
 * @lc app=leetcode.cn id=452 lang=cpp
 *
 * [452] 用最少數(shù)量的箭引爆氣球
 */

// @lc code=start
class Solution {
 public:
  int findMinArrowShots(std::vector<std::vector<int>>& points) {
    if (points.empty()) return 0;
    // 排序時需要注意,右坐標相等的情況
    sort(points.begin(), points.end(), [&](const auto& a, const auto& b) {
      if (a[0] == b[0]) {
        return a[1] < b[1];
      }
      return a[0] < b[0];
    });

    // 維護射擊的范圍癌椿,夾在中間
    int shoot_range[2] = {points[0][0], points[0][1]};

    int res = 1;
    for (const auto& pt : points) {
      if (pt[0] > shoot_range[0]) {  // 更新射擊范圍左邊界
        shoot_range[0] = pt[0];
      }
      if (pt[1] < shoot_range[1]) {  // 更新射擊范圍右邊界
        shoot_range[1] = pt[1];
      }
      if (shoot_range[0] <= shoot_range[1]) {  // 判斷射擊范圍是否合法
        continue;
      }
      res++;
      shoot_range[0] = pt[0];  // 重啟射擊范圍
      shoot_range[1] = pt[1];
    }
    return res;
  }
};

// @lc code=end
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末健蕊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踢俄,更是在濱河造成了極大的恐慌缩功,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件都办,死亡現(xiàn)場離奇詭異嫡锌,居然都是意外死亡,警方通過查閱死者的電腦和手機琳钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門势木,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歌懒,你說我怎么就攤上這事啦桌。” “怎么了及皂?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵甫男,是天一觀的道長且改。 經(jīng)常有香客問我,道長板驳,這世上最難降的妖魔是什么钾虐? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮笋庄,結(jié)果婚禮上效扫,老公的妹妹穿的比我還像新娘。我一直安慰自己直砂,他們只是感情好菌仁,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著静暂,像睡著了一般济丘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洽蛀,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天摹迷,我揣著相機與錄音,去河邊找鬼郊供。 笑死峡碉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的驮审。 我是一名探鬼主播鲫寄,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疯淫!你這毒婦竟也來了地来?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熙掺,失蹤者是張志新(化名)和其女友劉穎未斑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币绩,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蜡秽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了类浪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载城。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肌似,死狀恐怖费就,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情川队,我是刑警寧澤力细,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布睬澡,位于F島的核電站,受9級特大地震影響眠蚂,放射性物質(zhì)發(fā)生泄漏煞聪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一逝慧、第九天 我趴在偏房一處隱蔽的房頂上張望昔脯。 院中可真熱鬧,春花似錦笛臣、人聲如沸云稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静陈。三九已至,卻和暖如春诞丽,著一層夾襖步出監(jiān)牢的瞬間鲸拥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工僧免, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刑赶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓懂衩,卻偏偏與公主長得像角撞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勃痴,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容