有一堆石頭,每塊石頭的重量都是正整數。最大堆:每一回合,從中選出兩塊 最重的 石頭,然後將它們一起粉碎。假設石頭的重量分別為 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],這就是最後剩下那塊石頭的重量。
將所有石頭的重量放入最大堆中。每次依次從佇列中取出最重的兩塊石頭 aa 和 bb,必有 a \ge ba≥b。如果 a>ba>b,則將新石頭 a-ba−b 放回到最大堆中;如果 a=ba=b,兩塊石頭完全被粉碎,因此不會產生新的石頭。重複上述操作,直到剩下的石頭少於 22 塊。
最終可能剩下 11 塊石頭,該石頭的重量即為最大堆中剩下的元素,返回該元素;也可能沒有石頭剩下,此時最大堆為空,返回 00。
class solution
while(pq.size() > 1)
}return pq.isempty() ? 0 : pq.poll();
}}
複雜度分析
參考:
注:三種改變 priorityqueue 排序方式的辦法:
priorityqueuepq = new priorityqueue<>(comparator.reverseorder());
priorityqueue pq = new priorityqueue<>(new comparator()
});
priorityqueuepq = new priorityqueue<>((a, b) -> b - a);
每日一題 力扣 計畫
98 驗證二叉搜尋樹 問題給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 1.節點的左子樹只包含小於當前節點的數。2.節點的右子樹只包含大於當前節點的數。3.所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true示例2 輸入 5 1 4...
力扣每日一題 6 14
1300 轉變陣列後最接近目標值的陣列和 給你乙個整數陣列 arr 和乙個目標值 target 請你返回乙個整數 value 使得將陣列中所有大於 value 的值變成 value 後,陣列的和最接近 target 最接近表示兩者之差的絕對值最小 如果有多種使得和最接近 target 的方案,請你返...
每日一題力扣48
給定乙個 n n 的二維矩陣 matrix 表示乙個影象。請你將影象順時針旋轉 90 度。你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另乙個矩陣來旋轉影象。正解 旋轉90度就是,先鏡面對稱,再轉置即可 class solution defrotate self,mat...