Leetcode-453: 最小操作次数使数组元素相等(多种解法)

这篇博客详细介绍了如何解决LeetCode上的一个问题——找到使数组所有元素相等所需的最小操作次数。作者提供了两种思路:一是通过n-1个数加1转换为1个数减1,二是利用数学方法。每种思路都附带了C++代码实现,并展示了相应的结果。
摘要由CSDN通过智能技术生成

目录

题目链接

题目

示例

思路及代码

思路一 (n-1个数加1、转换成1个数减1)

思路一 C++代码

思路一 结果

思路二(数学方法)

思路二 C++代码

思路二 结果


题目链接

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

题目

给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。 (该题为深信服笔试原题)

示例

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

思路及代码

思路一 (n-1个数加1、转换成1个数减1)

一共有n个数,每次n-1个数同时加1,只有1个数不加,这就可以等价于每次只有1个数减1,求让数组所有元素相等的最小操作次数。转换成每次只有1个数减1处理起来就方便多了。所有元素最后相等,那最后的结果自然就是数组中最小的这个元素,每次操作只能对1个数减1,这样的话每个元素减去最小值求其和就是我们要的结果。

思路一 C++代码

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

    }
};

思路一 结果

思路二(数学方法)

假设原始数组总和为sum,我们需要操作次数为m,按照题意每次操作n - 1个数,那么最后整个数组总和sum增大m * (n - 1),这里的n为数组长度,最后数组所有元素都相等为x,于是有:

sum + m * (n - 1) = x * n

我们再设数组最小的元素为minm = x - min​,即 ​x = m + min 代入上式可得:

m = sum-min * n

因此,我们只需要知道原始数组总和sum,数组中最小元素min,数组长度n,即可得出需要的最小操作次数m。

思路二 C++代码

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

    }
};

思路二 结果

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值