[LeetCode] 1046.最後の石の重さ(簡単)(JAVA)
タイトルアドレス:https://leetcode.com/problems/last-stone-weight/
タイトル説明:
石のコレクションがあり、各石は正の整数の重みを持っています。
毎ターン、最も重い2つの石を選び、それらを一緒に粉砕します。石の重みがxとyで、x <= yであるとします。このスマッシュの結果は次のとおりです。
- x == yの場合、両方の石が完全に破壊されます。
- x!= yの場合、重みxの石は完全に破壊され、重みyの石は新しい重みyxになります。
最後に、残っている石は最大で1つです。この石の重さを返します(石が残っていない場合は0)。
例1:
Input: [2,7,4,1,8,1]
Output: 1
Explanation:
We combine 7 and 8 to get 1 so the array converts to [2,4,1,1,1] then,
we combine 2 and 4 to get 2 so the array converts to [2,1,1,1] then,
we combine 2 and 1 to get 1 so the array converts to [1,1,1] then,
we combine 1 and 1 to get 0 so the array converts to [1] then that's the value of last stone.
注意:
- 1 <= stones.length <= 30
- 1 <=石[i] <= 1000
一般的なアイデア
石の山があり、各石の重さは正の整数です。
ラウンドごとに、それらから最も重い2つの石を選択し、それらを一緒に粉砕します。石の重さがxとyで、x <= yであるとします。粉砕の可能な結果は次のとおりです。
- x == yの場合、両方の石が完全に粉砕されます。
- x!= yの場合、重さxの石は完全に押しつぶされ、重さyの石の新しい重さはyxになります。
結局、残る石はせいぜい1つだけです。この石の重量を返します。石が残っていない場合は、0を返します。
問題解決方法
- 最初に配列全体を並べ替えます
- 次に、最大の2つの配列を取り出し、等しい場合は破棄します。それ以外の場合は、2つの配列の差を並べ替えられた配列に挿入して、新しい昇順配列を形成します。
- ここでは最大のヒープが使用されます。最大値がヒープの一番上にあるたびに、2つの最大値を取り出して、その差を時間計算量に戻します。O(nlogn)
class Solution {
public int lastStoneWeight(int[] stones) {
PriorityQueue<Integer> queue = new PriorityQueue<>(stones.length, (a, b) -> (b - a));
for (int i = 0; i < stones.length; i++) {
queue.offer(stones[i]);
}
while (queue.size() > 1) {
Integer large = queue.poll();
Integer small = queue.poll();
if (large == small) continue;
queue.offer(large - small);
}
return queue.size() == 0 ? 0 : queue.poll();
}
}
実行時間:2ミリ秒、Javaユーザーの41.83%を上回っています
メモリ消費量:35.7 MB、Javaユーザーの85.05%を上回っています