[路飞]_leetcode-1046-最后一块石头的重量

114 阅读1分钟

题目描述

[题目地址]

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0

示例:

输入: [2,7,4,1,8,1]
输出: 1
解释:
先选出 78,得到 1,所以数组转换为 [2,4,1,1,1],
再选出 24,得到 2,所以数组转换为 [2,1,1,1],
接着是 21,得到 1,所以数组转换为 [1,1,1],
最后选出 11,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。
复制代码

提示:

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 1000

本题很简单,只需要根据题意要求,每次找出最大的两个值
如果相等,继续取出最大的两个值
如果不等,将它们的差值插入数组,继续取值 直到数组中元素的数量小于两个,此时返回数组中唯一的元素值或者 0 即可

基于以上解题思路,我们有三种方式解题

分析:sort 排序

每次将数组进行升序排序,这样最大的两个值就是数组末尾的两个值
不断取出最大的两个值操作,直到数组中元素数量小于 2

代码实现

var lastStoneWeight = function(stones) {
  // 当数组长度大于1的时候取出最大的两个值操作
  while(stones.length>1){
    // 将数组进行升序排序
    stones.sort((a,b) => a-b)
    // 排序后数组末尾的两个值就是最大的两个值
    const num1 = stones.pop(),
    num2 = stones.pop();
    // 如果两数不等,将差值插入数组
    if(num1!==num2) stones.push(num1-num2);
  }
  return stones[0]||0;
};

至此我们就完成了leetcode-1046-最后一块石头的重量