一道题,最小操作次数使数组元素相等引发的思考

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

前言



最近在打卡力扣刷题,一道简单题但是感觉挺好的。

力扣453:最小操作数使数组相等。


题目描述为:


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


分析



拿到这题,题目告诉我们所有数字都只能增加,这里要求的是次数,每一次的效果是其他都增加1,其实也是其他相对不变自己减1,让所有数字相等,就是让所有数字都减到数组中的最小次数就行啦。


1bef5a16cfc54d4fb1af0cf9995ead65.png


但是实现的时候可以先设一个比最小还小的数字(先计算到这么小数字的次数),然后顺序统计的途中标记最小的,最后再拿总次数减去这个次数就可以了。


898c8864060f4df199eac0a01abc0be5.png

实现代码



class Solution {
    public int minMoves(int[] nums) {
        if(nums.length==0)
            return 0;
        int min=nums[0];
        long va=0;
        int MIN=Integer.MIN_VALUE;
        for(int i=0;i<nums.length;i++){
            va+=nums[i]-MIN;
            if(nums[i]<min)
                min=nums[i];
        }
        va-=(long) (min-MIN)*nums.length;
        return (int)va;
    }
}


结语



这个题的做法技巧是 换位思考,别人都增加,其实你就是减少,我们要将复杂的加法问题转换成简单的减法问题。


还有好像也在暗示着什么,别人都在进步的时候,你原地不动就是在退步,你也很难超凡比别人强太多,想要不落下,就是要一步一个脚印,刷题打卡!


这是第三次组织csdn小伙伴一起力扣每日一题打卡,有需要的可以通过下面公号👇🏻👇🏻👇🏻关注加我,然后我拉你进每日一题力扣打卡一起学习交流!


目录
相关文章
|
2月前
最小操作次数问题
最小操作次数问题
19 1
|
4月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
5月前
|
算法 测试技术 C#
C++二分查找算法的应用:长度递增组的最大数目
C++二分查找算法的应用:长度递增组的最大数目
|
7月前
交换两个数的值的方法(三种)
交换两个数的值的方法(三种)
34 1
|
10月前
|
Cloud Native Go
801. 使序列递增的最小交换次数:动态规划
这是 力扣上的 801. 使序列递增的最小交换次数,难度为 困难。
|
11月前
随机1-100的数循环找出88的次数
随机1-100的数循环找出88的次数
51 0
|
算法 Go
算法练习第十题——寻找重复数(不修改数组)
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
|
算法
Day1——数组 二分查找、移除一个数
Day1——数组 二分查找、移除一个数
88 0
Day1——数组 二分查找、移除一个数
获取最小操作次数使数组元素相等
获取最小操作次数使数组元素相等(算法题)