1. 题目描述
We have a collection of stones, each stone has a positive integer weight.
Each turn, we choose the two heaviest stones and smash them together. Suppose the stones have weights x and y with x <= y. The result of this smash is:
If x == y, both stones are totally destroyed;
If x != y, the stone of weight x is totally destroyed, and the stone of weight y has new weight y-x.
At the end, there is at most 1 stone left. Return the weight of this stone (or 0 if there are no stones left.)
2. 示例
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.
3. 算法思路
1、不需要特别复杂的算法,遍历即可
2、对于不定长遍历,通常的做法是倒序,这样的好处是可以控制每次改变的数
3、为啥每次循环之前要排序呢?这样可以避免判断两个石头相减为负,即每次都是重的石头-轻的石头(或者相等)
4. Java代码
class Solution {
public int lastStoneWeight(int[] stones) {
if (stones.length == 1) {
return stones[0];
}
// 从最后一个石头开始
for (int i = stones.length - 1; i > 0; --i) {
// 排序0到最后一个石头
Arrays.sort(stones, 0, i + 1);
// 将粉碎剩余放入靠前的石块
stones[i - 1] = stones[i] - stones[i - 1];
}
return stones[0];
}
}