leetcode_453. Minimum Moves to Equal Array Elements 移动最小步数使数组中各数字相等

题目:

Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

Input:
[1,2,3]

Output:
3

Explanation:
Only three moves are needed (remember each move increments two elements):

[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

题意:

给定一个长度为n的非空整数数组,每次同时移动数组中的n-1个数,使他们增加1。问,需要最少移动多少步,可以使数组中各数字最后相等。


代码:

class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        
        n = len(nums)
        if n < 2 :
            return 0
        else :
            min_num = min(nums)        #找数组中最小的数
            
            res = 0                  #记录移动的步数
            
            for i in range(n) :
                res += nums[i]-min_num              #每个数字减去最小数字的和,即为最终的需要移动的最小步数
            
            return res


笔记:

思路:

假设数组为 a1,a2,a3,……,an,不妨假设a1<a2<a3<……<an。首先,将a1移到与a2相等,需要移动a2-a1步,序列变成a2,a2,a3+a2-a1,……,an+a2-a1。继续将a2移到与a3相等,需要移动 (a3+a2-a1)- a2 = a3-a1步,此时,序列变成a3+a2-a1,a3+a2-a1,a3+a2-a1,……an+a2-a1+a3-a1。如此往复下去,最后,将前n-1个数移动an-a1步,即将所有数字变成相等。即每一次移动,都需要移当前数字与最小数字相减的步数。

故总的移动步数为 a2-a1 + a3-a1 + …… + an-a1。其中,a1为数组中的最小的数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值