这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战。
题目描述:
453. 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com)
给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
示例一
输入:nums = [1,2,3]
输出:3
解释:
只需要3次操作(注意每次操作会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
示例二
输入: nums = [1,1,1]
输出: 0
提示:
- n == nums.length
- 1 <= nums.length <= 10^5
- -10^9 <= nums[i] <= 10^9
- 答案保证符合 32-bit 整数
思路分析
数学法
题目给的操作是 每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数
这个我们可以换个思路去理解
即 每次让一个元素减少1,将所有数都减少到数组中最小的数的步数即是答案。
所以,解题思路很简单,我们先找到最小的数,然后遍历数组,每个数与最小数的差值即为这个数减少到最小数的步数,那循环结束,累计的步数即是答案。
AC代码
class Solution {
fun minMoves(nums: IntArray): Int {
val min : Int = nums.min() ?: 0
var results = 0
if(min != null){
nums.forEach {
results += it - min
}
}
return results
}
}
总结
这题代码很简单,关键在于要想明白这其中的逻辑,反向思维去解这题就非常容易,当然这其中其实是有数学的思想在里面的,想不明白的可以看看参考里几个大佬的思路,讲的很清楚。
参考
最小操作次数使数组元素相等 - 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com)
【宫水三叶の相信科学系列】详解「原始最小值」与「最小操作次数」关系 - 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com)
【算法小爱】你们都变大了不就等于我变小了( ̄∇ ̄) - 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com)