zl程序教程

您现在的位置是:首页 >  后端

当前栏目

最小操作次数使数组元素相等

数组 操作 元素 最小 次数 相等
2023-09-11 14:17:55 时间

原题链接:

https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/

题目描述

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

示例1:

输入:nums = [1,2,3]
输出:3
解释:
只需要3次操作(注意每次操作会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

示例2:

输入:nums = [1,1,1]
输出:0

提示:

  • n == nums.length
  • 1 <= nums.length <= 105
  • 109 <= nums[i] <= 109
  • 答案保证符合 32-bit 整数

思路方法:

这道题乍一看,有点让人摸不着头脑🤣(说白了原来是我太菜了)
其实这是一道数学题!!!

在这里插入图片描述
小明: 兄台何出此言。我咋没看出来⁉️
宇哥: 让我给你慢慢道来☕
宇哥: 小明,你看呀。题干中说每次操作都会使n - 1个元素加1,那么我假设目前数组的总和为sum,最少需要移动的次数为m,所以说整体数组的总和最终会增加m * (n - 1)
小明: 宇哥所言极是!👍
宇哥: 最终所有元素都相等,这里我设为x。那么,sum + m * (n - 1) = x * n;
小明: 对,就是这样。然后呢?这不还是有两个未知数嘛,无解呀🙃
宇哥: 别急嘛,这里我假设数组中最小的元素为min,你难道没发现m = x - min😏
小明: 嗦嘎!😮,所以联立这两个方程就可以得出m = sum - min * n;
宇哥: Bingo!🎉

注意: 此处还应考虑到数据超出范围的问题!

AC代码:

class Solution {
public:
    int minMoves(vector<int>& nums) {
        int ans = 0;
        sort(nums.begin(),nums.end());
        int min = nums[0], n = nums.size();
        for(int i = 0; i < n; i++){
            ans += nums[i] - min;
        }
        return ans;
    }
};