石の山があり、各石の重さは正の整数です。
各ラウンドで、それらから最も重い2つの石を選択し、それらを一緒に粉砕します。石の重さがxとyで、x <= yであるとします。粉砕の可能な結果は次のとおりです。
x == yの場合、両方の石が完全に粉砕されます
。x!= yの場合、重量xの石は完全に粉砕され、重量yの石の新しい重量はyxになります。
結局、残る石はせいぜい1つだけです。この石の重量を返します。石が残っていない場合は、0を返します。
例:
入力:[2,7,4,1,8,1]
出力:1
説明:
最初に7と8を選択して1を取得し、配列が[2,4,1,1,1]に変換され
、次に2に変換されます。そして4、get 2、配列は[2,1,1,1]に変換され、
次に2と1、get 1、配列は[1,1,1]に変換され、
最後に1と1は選択すると、0が取得されます。最終的な配列は[1]に変換されます。これは、最後に残っている石の重量です。
促す:
1 <= stones.length <= 30
1 <= stones [i] <= 1000
アイデア:私はそれを一種の暴力で書いたので、ここには投稿しません。公式の最大の山を投稿して学びます。
class Solution {
public int lastStoneWeight(int[] stones) {
//最大堆
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);
for (int stone : stones) {
pq.offer(stone);
}
while (pq.size() > 1) {
int a = pq.poll();
int b = pq.poll();
if (a > b) {
pq.offer(a - b);
}
}
return pq.isEmpty() ? 0 : pq.poll();
}
}