keyword : maximum, minimum
heap: 走訪過的資料中,可以快速取出最大/最小的數值。
給你一個字串s,good的定義是字串內char出現的頻率都不一樣。試問最少要刪除多少char才可以使s變成good。
- 刪除最少的char,表示s是最長的good string。
- 從Greedy的角度來說,我從最大freq的char開始取,遇到相同freq的char就少1,這樣就可以得到最大的good string。
- 使用max-heap來排序。每次都從最大freq的char來取。
- 使用maxAllow來記錄目前最大的freq是多少。
- 因為heap是拿來排序用,也可以使用sort來排序。
time complexity : O(N) + O(KlogK) + O(KlogK)
space complexity : O(1) 不管s長度為何皆為vector<int>(26)
給你一個課程列表vector<vector<int>> courses,其中courses[i][0]表示課程持續的時間,courses[i][1]表示可以修這門課的最後時間。每一個時間只能修一門課,試問最多可以修多少課。
- 從Greedy的角度來說,越早結束的課要先修,如果超過時間,則退選需要最長時間的課,因為這樣有越多時間可以修更多課。
- 越早結束的課要先修 –> 使用sort依據lastday對課程排序。
- 退選需要最長時間的課 –> 使用max-heap來記錄修過的課中最長duration的課。
給你幾個袋子,每個袋子有最大容量和已經放進去的rocks,並且給你一些額外的additionalRocks,試問最多可以裝買多少袋子。
- 問題是要裝滿最多的袋子。所以從快滿的袋子開始裝,就可以達到最多的袋子。
- 使用priority_queue(min-heap)來存放每個袋子剩多少裝滿的數值。
- 每次都取最小數值出來計算。
- 目標是找到加最少次的油,就可以到達終點。
因為車子有油桶無限大,加最少次–> 每次都加最多的那一個。
給你n個工程師,每個工程師都有自己的speed和efficiency。從中選出最多k個工程師,有最大的performance。其中performance的定義為
performance = sum(speed) * min(efficiency)
- 因為最低的efficienfy會決定群組的efficiency,所以對efficienfy排序。
- 當hp < 1的時候,必須從過去經過會損傷的,選一個最大的出來 -> greedy point.
- 既然是從過去會損傷的選一個最大的 => priority_queue
- 必須先推入,再判斷,因為當前的也有可能跳過。
- 參考lee215答案
- 先使用ladders,
- 沒了ladders再使用bricks
- 如果bricks不夠,就從之前使用過ladders選一個最小的出來
- 因為高度差小使用ladders太浪費了
- 為什麼先使用ladders? 因為每個高度差都要用ladders和bricks來比較。先使用ladders最後在使用pq中的bricks會讓每個高度差兩種可能比較過。才可以得到最佳解。
leetcode
刷題