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。最後,最...