【每日一題】力扣1046.最後一塊石頭的重量
題目描述(傳送門)
有一堆石頭,每塊石頭的重量都是正整數。
每一回合,從中選出兩塊 最重的 石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x <= y。那麼粉碎的可能結果如下:
如果 x == y,那麼兩塊石頭都會被完全粉碎;
如果 x != y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y-x。
最後,最多隻會剩下一塊石頭。返回此石頭的重量。如果沒有石頭剩下,就返回 0。
示例:
輸入:[2,7,4,1,8,1]
輸出:1
解釋:
先選出 7 和 8,得到 1,所以陣列轉換為 [2,4,1,1,1],
再選出 2 和 4,得到 2,所以陣列轉換為 [2,1,1,1],
接著是 2 和 1,得到 1,所以陣列轉換為 [1,1,1],
最後選出 1 和 1,得到 0,最終陣列轉換為 [1],這就是最後剩下那塊石頭的重量。
解題思路
方法一:sort暴力
對stones 陣列進行排序,然後將最大的兩個相減,差值更新到len-1下標,另一個更新為0.對陣列在進行排序。。
一直這樣迴圈,每次排序之後都保證了,兩個最大值相減,最後迴圈結束,剩下的最大值就是最後剩下的那塊石頭的重量。
public int lastStoneWeight(int[] stones) {
Arrays.sort(stones);
int len = stones.length;
while (len-- >=0) {
stones[stones.length-1] = stones[stones.length-1] - stones[stones.length - 2];
stones[stones.length-2] = 0;
Arrays.sort(stones);
}
return stones[stones.length - 1];
}
方法二:大頂堆
利用PriorityQueue優先佇列實現大堆,相關用法可以檢視API以及原始碼。
構造方法:
介面方法:
public int lastStoneWeight(int[] stones) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>((a, b) -> b - a);
/**
* 重寫compare方法。
* 在此體現了所謂的"自定義":即根據自己所寫邏輯來決定實現最大/小堆
*/
// a-b 則是小根堆
for (int stone : stones
) {
priorityQueue.offer(stone);
}
while (priorityQueue.size() > 1) {
int a = priorityQueue.poll();
int b = priorityQueue.poll();
if (a - b > 0) {
priorityQueue.offer(a - b);
}
}
return priorityQueue.isEmpty()?0:priorityQueue.poll();
}
相關文章
- 字典序的下一個排序--力扣每日一題排序力扣每日一題
- Day 38 | 1049. 最後一塊石頭的重量 II 、494. 目標和 、474.一和零
- 力扣 204. 計數質數(每日一題)力扣每日一題
- 程式碼隨想錄演算法訓練營 | 1049. 最後一塊石頭的重量 II,494. 目標和,474.一和零演算法
- 程式碼隨想錄day36 || 1049 最後一筐石頭重量||, 494 目標和,474 一和零
- 程式碼隨想錄演算法訓練營第42天 | 1049. 最後一塊石頭的重量 II 、494. 目標和 、474.一和零演算法
- 【leetcode】(每日一題 771 寶石與石頭)LeetCode每日一題
- python力扣刷題記錄——771. 寶石與石頭Python力扣
- [力扣每日一題]714. 買賣股票的最佳時機含手續費力扣每日一題
- LeetCode每日一題: 寶石與石頭(No.771)LeetCode每日一題
- LeetCode每日一題: 最後一個單詞的長度(No.58)LeetCode每日一題
- 程式碼隨想錄演算法訓練營第四十三天|● 1049. 最後一塊石頭的重量 II ● 494. 目標和 ● 474.一和零演算法
- 程式碼隨想錄演算法訓練營第四十三天 | 474.一和零,● 494. 目標和 ,1049. 最後一塊石頭的重量 II演算法
- 【Logo】發現了一塊神奇的石頭Go
- 力扣題解-387. 字串中的第一個唯一字元力扣字串字元
- 每日一道演算法:最後一個單詞的長度演算法
- 【每日一題】無重複字元的最長子串每日一題字元
- 力扣85-最大矩形(巧妙利用上一題解答 Java版題解)力扣Java
- 每日一題每日一題
- VI 跳到最後一行和跳到最後一行的最後一個字元字元
- VI操作--跳到最後一行和跳到最後一行的最後一個字元字元
- Solmyr和Zero的故事 —— 記憶體,最後一塊 (轉)記憶體
- [每日一題] 第四題:圓圈中最後剩下的數字每日一題
- 用 PHP 在 力扣 上演算法 [無重複字元的最長子串]{一天一更}PHP力扣演算法字元
- LeetCode每日一題:最長公共字首(No.14)LeetCode每日一題
- 每日一題2每日一題
- 每日一題1每日一題
- LeetCode每日一題: 階乘後的零(No.172)LeetCode每日一題
- 力扣刷題-滑動視窗(字串)力扣字串
- 力扣-96. 下一個更大元素 I力扣
- python力扣刷題記錄——1480. 一維陣列的動態和Python力扣陣列
- sicp每日一題[2.29]每日一題
- sicp每日一題[2.43]每日一題
- sicp每日一題[2.44]每日一題
- sicp每日一題[2.47]每日一題
- sicp每日一題[2.58]每日一題
- sicp每日一題[2.59]每日一題
- sicp每日一題[2.60]每日一題