当前位置: 代码迷 >> 综合 >> js + leetcode刷题:No.1046 最后一块石头的重量
  详细解决方案

js + leetcode刷题:No.1046 最后一块石头的重量

热度:104   发布时间:2023-09-22 01:56:05.0
标签:贪心算法;难度:简单
思路:先排序,找最大两个,比较,有差则将差按照二分查找方式放进数组(这样理论上快一点)。所以在一定程度上,觉得这个题目考的是数据插入(二分插入)

不过,哇哈哈哈,一个splice没有控制好位置,搞了我两个小时啊。插入应该从小于target的点加1个位置插进去;找个时间把数组的十大排序理一理

题目:

  1. 最后一块石头的重量
    有一堆石头,每块石头的重量都是正整数。
    每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。

提示:

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

解法:

// 时间O(NlogN)  空间O(1)
/*** @param {number[]} stones* @return {number}*/
var lastStoneWeight = function(stones) {// 数组排序stones.sort((a,b) => {return a-b})while(stones.length >= 2){// 取出最大的两个数let x = stones.splice(stones.length-1, 1)[0], y = stones.splice(stones.length-1, 1)[0]// console.log("stones, x,y", stones, x,y)if(x!==y){let newStone = Math.abs(x-y)if(stones[stones.length-1] <= newStone || stones.length === 0){stones.push(newStone)continue}if(stones[0] >= newStone){stones.unshift(newStone)continue}insertData(stones, 0, stones.length-1, newStone)}}return stones.length === 0 ? 0 : stones[0]
};var insertData = function(arr, start, end, target){if(arr[end] <= target){arr.splice(end+1, 0, target)}else if(start === end || arr[start] >= target){arr.splice(start, 0, target)}else{let mid = Math.floor((start + end)/2)if(arr[mid] <= target && arr[mid+1] >= target){arr.splice(mid+1, 0, target)return}else if(arr[mid] < target){insertData(arr, mid, end, target)}else{insertData(arr, start, mid, target)}}
}
写在最后:

嘿,伙计,如果你再看,有问题或者觉得哪里不对,请你给我留个言哈!尤其我最近在学习计算复杂度,自己觉得原理懂了,哈哈哈,多谢