[LeetCode] 1046.最後の石の重さ(簡単)(JAVA)1日1つの質問

[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を返します。

問題解決方法

  1. 最初に配列全体を並べ替えます
  2. 次に、最大の2つの配列を取り出し、等しい場合は破棄します。それ以外の場合は、2つの配列の差を並べ替えられた配列に挿入して、新しい昇順配列を形成します。
  3. ここでは最大のヒープが使用されます。最大値がヒープの一番上にあるたびに、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%を上回っています

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/111942674