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

目录

题目链接

题目

示例

思路及代码

思路一 (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& nums) {
        int min = *min_element(nums.begin(), nums.end());
        int sum=0;
        for(int i=0;i

思路一 结果

Leetcode-453: 最小操作次数使数组元素相等(多种解法)_第1张图片

思路二(数学方法)

假设原始数组总和为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& nums) {
        int min = *min_element(nums.begin(), nums.end());
        int sum=0;
        int n=nums.size();
        for(int i=0;i

思路二 结果

Leetcode-453: 最小操作次数使数组元素相等(多种解法)_第2张图片

 

 

 

你可能感兴趣的:(Leetcode,c++,leetcode,算法)