[LeetCode] 453. 最小操作次数使数组元素相等

这篇博客探讨了如何找到使非空整数数组所有元素相等所需的最小操作次数。作者尝试了三种不同的算法实现,包括逐次增加除最大值外的元素、直接增加最小值与最大值的差值,以及累加元素与最小值的差值。尽管前两种方法导致超时,但第三种方法通过累加元素与最小值的差值得到了正确的解决方案。博客还强调了刻意练习算法和数据结构的重要性。
摘要由CSDN通过智能技术生成

给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。

想了3分钟都要看题解了,先把这个写出来试试
第一种:
将 1 添加到除最大元素之外的所有元素,并增加移动数的计数

var minMoves = function (nums) {
  let result = 0;
  while(Math.min(...nums) !== Math.max(...nums)){
    let max = Math.max(...nums);
    let j = nums.findIndex(val=>max==val);
    nums = nums.map((val,i)=>{
        return i == j? val:val + 1
    })
    result++;
  }
  return result;
};

测试用例通过,提交超时(自己没有用多例子测试,只顾着解题的高兴了)

第二种:
直接让最小值加到最大值,提交又超时了,这个时候回过神了,需要找规律了

var minMoves = function (nums) {
  let result = 0;
  while(Math.min(...nums) !== Math.max(...nums)){
    let minute = Math.max(...nums) - Math.min(...nums)
    let max = Math.max(...nums);
    let j = nums.findIndex(val=>max==val);
    nums = nums.map((val,i)=>{
      return i == j ? val : val + minute
    })
    result += minute;
  }
  return result;
};

第三种:
最小的n-1个元素都++ 相当于 把最大的元素–,
也就是每次把最大的元素-1 直到所有元素都等于最小元素
所有元素与最小元素的差之和

var minMoves = function (nums) {
  let min = Math.min(...nums);
  return nums.reduce((result,val, i) => {
    return val - min + result
  },0)
}

你不想使用js自带的Math.min、reduce方法可以用这种

var minMoves = function (nums) {
  let min = nums[0];
  for (let i = 1; i < nums.length; i++) {
    if (min > nums[i]) {
      min = nums[i]
    }
  }
  let result = 0;
  for (let i = 0; i < nums.length; i++) {
    result = nums[i] - min + result;
  }
  return result;
}

继续努力。
刻意练习的步骤在这里可以参考:

怎么刻意练习算法与数据结构

日期
2021.04.28
2021.04.29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值