首页 > 其他分享 >453.最小操作次数使数组元素相等

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

时间:2023-04-02 12:00:59浏览次数:56  
标签:相等 val min sum 453 次数 最小值 数组 nums

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

给你一个长度为 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 整数

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-moves-to-equal-array-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路1

正向思考的过程。假设m为操作次数,x为最后的相等的结果,则sum + m * (n-1) = x * n,方程中多了一个未知的变量,也就是最后的值x,接下来也是最重要的部分了,x = min_val + m,也就是每次增加时最小值都必须包含在内。我们还是从正向的角度来看,最后要如何才能使得所有的结果相等。首先是将数组中的最大值排除在外,最小值带着其余的值不断增加,知道最小值和最大值相等(抹平和最大值之间的差);现在最小值和第二个大的值之间的差并没有被抹平,但是最大值和最小值是相等的,现在是把原先第二大的值排除在外,其余的数值增加,抹平最小值和第二大的数值之间的差值;现在是第三个大的值和最小值之间的差值没有被抹平,所以第三个最大值被排除在外,其余数值不断增大直到最小值和第三个大的值相等,不断进行下去抹平最小值和其余值之间的差距。
其实使得最后结果相等的过程就是使得最小值抹平和其余值之间的差值,首先是选择一个和最小值不相等的值,将其排除在外,不断增大最小值,直到两者相等,抹平差值,再选择下一个和最小值不等的,将其排除在外,不断增大最小值,直到两者相等,抹平差值,并不断进行下去,抹平最小值和每个数之间的差距。其实从这里来看,就有m = \(\sum_{i=0}^{n}(nums[i] - min\_val)\)。
不过只是为了说明x = min_val + m,代入得到m = sum - min_val * n.

code1

class Solution {
public:
    //每次操作会使n-1个数增加1
    //求最小操作次数使得元素数目相等
    
    //数学题:假设操作次数为m,初始和为sum,最后的值为x
    //sum + m * (n-1) = n * x
    //还差最后的数值x未知
    //脑筋急转弯:x = m + min_val
    //最小值必然每次都会被增加

    //m = sum - min_val * n

    int minMoves(vector<int>& nums) {
        
        long long int min_val = nums[0];
        long long int sum = 0;
        for(auto item : nums)
        {
            sum += item; 
            if(item < min_val) min_val = item;
        }

        return sum - min_val * nums.size();
    }
};

解题思路2

逆向思维,最后都是为了抹平差距,n-1个数加上1相当于1个数减去1,最后相等的结果就是所有数都等于最小值,也是可以得到正向推导中的公式:m = \(\sum_{i=0}^{n}(nums[i] - min\_val)\)。

code

class Solution {
public:
    //逆向思维
    //n-1个元素增加1
    //相当于一个元素减少1
    //所有元素都减少到最小值则相等

    int minMoves(vector<int>& nums) {
        int min_val = nums[0];

        for(auto item : nums) if(item < min_val) min_val = item;
    
        int ans = 0;
        for(auto item : nums) ans += item - min_val;

        return ans;
    }
};

标签:相等,val,min,sum,453,次数,最小值,数组,nums
From: https://www.cnblogs.com/huangxk23/p/17280198.html

相关文章

  • 1438. 绝对差不超过限制的最长连续子数组
    力扣题目链接给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。 示例1:输入:nums=[8,2,4,7],limit=4输出:2解释:所有子数组......
  • [LeetCode] 1338. Reduce Array Size to The Half 数组大小减半
    Youaregivenanintegerarray arr.Youcanchooseasetofintegersandremovealltheoccurrencesoftheseintegersinthearray.Return theminimumsizeofthesetsothat atleast halfoftheintegersofthearrayareremoved.Example1:Input:arr=......
  • java方法-稀疏数组
    稀疏数组当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值把具体不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模如图:左原始数组,右稀疏数组 ......
  • 树状数组
    树状数组简介树状数组是一种用于维护\(n\)个数的区间和的数据结构。一般能用树状数组做的题,都可以使用线段树来做。相较于码量,树状数组的码量要比线段树少许多,不过相对应的,它所能实现的功能没有线段树多。好的,不多说废话,下面进入正题。例题1:P3374【模板】树状数组1例题......
  • 剑指offer42(Java)-连续子数组的最大和(简单)
    题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释: 连续子数组 [4,-1,2,1]的和最大,为 6。提示:1<= arr.length<=10^5-100<=arr[i]<=1......
  • HJ69_矩阵乘法_数组
    思路:三层循环实现矩阵相乘。importsysa=[]forlineinsys.stdin:  a.append(list(map(int,line.strip().split())))#print(a)matrix1=a[3:3+a[0][0]]matrix2=a[3+a[0][0]:]nw=[[0foriinrange(a[2][0])]foriinrange(a[0][0])]forminrange(a[0][0]): ......
  • VBA 对象数组排序算法分享
     FunctionSrotObjectByProperty(objsToSortAsVariant,PropertyNameAsString,Optional降序AsBoolean=True)IfIsEmpty(objsToSort)ThenExitFunctionIfInStr(TypeName(objsToSort),"()")<1ThenExitFunction'IsArray()issom......
  • Java 数组
    数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们数组的声明和创建首先必须声明数组变量,才能在程序中使用数组。Java语言使用new操作符来创建数组,语......
  • Java 稀疏数组
    稀疏数组当一个数组中大部分元素为0时,或者为同一值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模下面对该原始数组进行压缩,求出其稀疏数......
  • 【LBLD】小而美的算法技巧:前缀和数组
    【LBLD】小而美的算法技巧:前缀和数组一维数组中的前缀和classNumArray{private:vector<int>preSum;public:NumArray(vector<int>&nums){preSum.push_back(0);for(inti=1;i<nums.size()+1;i++){preSum.push_back(......