leetcode数组--最少移动次数使数组元素相等

题目

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]
输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):

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

思路

一开始自己对其理解有偏差,所有的数与最大的数比较,每一次用最小的数加一直到等于最大的数,从网上看到可以逆向思维,用所有元素之和减去最小值与长度的乘积。

代码

class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return sum(nums)-min(nums)*len(nums)

题目二

给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。
例如:
输入:
[1,2,3]
输出:
2
说明:
只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1):
[1,2,3] => [2,2,3] => [2,2,2]

思路

先对数组进行排序,然后找到中位数,所有数与中位数之差的和,就为移动步数

代码

class Solution(object):
    def minMoves2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        mid = len(nums)//2
        res =0
        for n in nums:
            res +=abs(n-nums[mid])
        return res

猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/85253350
今日推荐