java中用優先隊列解決最後一塊石頭重量問題

問題如下:
在這裏插入圖片描述
遇到這種選出最重最大最小的問題,首先我們就想到可以用優先隊列來解決。

public int lastStoneWeight(int[] stones) {
       
        PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2-o1);
        for(int i:stones) {
            queue.offer(i);
        }
        while(queue.size() >= 2) {
            Integer x = queue.poll();
            
            Integer y = queue.poll();
            
            queue.offer(x-y);
            
        }
        
        
     return queue.poll();
    }

我們可以實例化一個優先隊列,由於標準庫中的優先隊列默認爲小堆,就是最先出隊列的是最小的,此時呢我們就自己定義優先級,讓最大的先出隊列,操作就是這段代碼:(o1, o2) -> o2-o1
創建好後,把數組中的值入隊列。由於要一次出兩個數,循環條件就設爲,隊列中的個數最少要爲2,然後出兩次隊列就把隊列中最大的兩個數找出來了,最後把兩數之差再加入隊列中,此處有點小機靈,提上說,如果隊列最後爲空,就返回0,否則就返回剩下的那個數,我們這裏不管兩個數的大小關係,直接把第一個數和第二個數的差加入到隊列裏,加入兩個數不相等,則就是題上意思把兩數的差加入到隊列裏,假如兩個數相等,則把0加入到隊列裏了,假如前面隊列裏的數都出隊列完了,我們可以去試試,結果隊列裏就只剩下一個0了,直接返回這個隊列出隊列後的值,就是0,假如原本隊列裏還剩一個數,那和0作差後,結果也還是那個數,所以我們直接出循環後返回出隊列後的值,就是最終結果,方便了不少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章