谁能想到我今天才做day12的题呢
小说误国!!小说误国啊!!!(痛心!!
题目描述(来自力扣)
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
示例:
输入:[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],这就是最后剩下那块石头的重量。
解题思路
要取最大的两个数比较,首先想到排序,而且根据这道题目的意思,每次都要取当前的最大值,也就是每次操作后都要进行重新排序。因此,大概整理思路:
(1)对数组进行排序
(2)取最大的两个数进行比较(也就是数组最后两个数),根据是否相等做出相应处理
(3)对处理过后的数组重新进行排序
(4)重复(1)(2)(3)直至全部处理完毕
对于上述步骤,有两个地方需要细化:
(1)如何处理两个最大值
现在有的是一个定长数组且其中元素都是大于等于1的正整数,那么不用费心去想那些被“粉碎”的石头是不是要从数组中删去,可以直接将他们设为0
。
对于具体操作,直观想法肯定是判断是否相等,如果不等就将y
设为y-x
,将x
设为0
,如果相等,则将二者都设为0
。但事实上这一步在具体操作时可以优化,不需要分情况判断,直接将y
设为y-x
,而x
设为0
即可,这样就已经涵盖了二者相等的情况
(2)如何判断处理完毕
用一个for循环进行处理,以数组长度为循环次数,这样一定可以保证循环结束即处理完毕,但这样处理会存在很多无效操作,因此可以在循环中判断,当排序过后的数组倒数第二个数为0,也就是除了倒数第一个元素外,不再存在有效值时,就可以退出循环返回结果了
根据上述分析,可以比较容易地写出代码:
class Solution {
public int lastStoneWeight(int[] stones) {
if (stones == null || stones.length == 0) {
return 0;
}
int index = stones.length - 1;
for (int i = 0; i < stones.length - 1; ++i) {
Arrays.sort(stones);
if (stones[index - 1] == 0)
break;
stones[index] -= stones[index - 1];
stones[index - 1] = 0;
}
return stones[stones.length - 1];
}
}