最後一塊石頭的重量20201230

2021-10-13 12:48:22 字數 1783 閱讀 5172

2. 排序法

最後一塊石頭的重量

有一堆石頭,每塊石頭的重量都是正整數。

每一回合,從中選出兩塊 最重的 石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x <= y。那麼粉碎的可能結果如下:

示例:

輸入:[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],這就是最後剩下那塊石頭的重量。

大頂堆比較簡潔,但是每取出乙個元素都需要維持大頂堆,因此比較耗時;

public

intlaststoneweight1

(int

stones)

while

(queue.

size()

>1)

}return queue.

isempty()

?0: queue.

poll()

;}

主要思路:

這種方法也比較簡單,相對上面的方法少排序。

public

intlaststoneweight

(int

stones)

else

quicksort

(stones);}

return stones[len-1]

;}// 陣列排序

public

static

void

quicksort

(int

array)

sort

(array,

0, len -1)

;}/** * 快排核心演算法,遞迴實現

* @param array

* @param left

* @param right

*/public

static

void

sort

(int

array,

int left,

int right)

// base中存放基準數

int base = array[left]

;int i = left, j = right;

while

(i != j)

// 再從左往右邊找,直到找到比base值大的數

while

(array[i]

<= base && i < j)

// 上面的迴圈結束表示找到了位置或者(i>=j)了,交換兩個數在陣列中的位置

if(i < j)

}// 將基準數放到中間的位置(基準數歸位)

array[left]

= array[i]

; array[i]

= base;

// 遞迴,繼續向基準的左右兩邊執行和上面同樣的操作

// i的索引處為上面已確定好的基準值的位置,無需再處理

sort

(array, left, i -1)

;sort

(array, i +

1, right)

;}

最後一塊石頭重量

有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出兩塊 最重的 石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x y。那麼粉碎的可能結果如下 如果 x y,那麼兩塊石頭都會被完全粉碎 如果 x y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y x。最後...

Leetcode 最後一塊石頭的重量

有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x y。那麼粉碎的可能結果如下 如果 x y,那麼兩塊石頭都會被完全粉碎 如果 x y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y x。最後,最...

24 最後一塊石頭的重量

有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x y。那麼粉碎的可能結果如下 如果 x y,那麼兩塊石頭都會被完全粉碎 如果 x y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y x。最後,最...