Minimum Moves to Equal Array Elements

反向思维,除最大全加1和最大减1的效果是一样的

class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        tmp = min(nums)
        result = 0
        for num in nums:
            result += (num - tmp)
        return result

Minimum Moves to Equal Array Elements II

上面一题是反向思维,这一题就是完全看观察了,结论很简单,最小移动数一定是基于数组的中位数的,所以我们找出中位数计算就行了,这里用的排序然后直接把两个有可能为中位数的点找出来了(因为奇偶数的中位数情况不一样),我们用这两个数分别算出次数,小的那个就是答案,另外这题当然也可以用quick select做,那样就是真O(n)算法了,不过这里用排序速度比划分还要快

class Solution(object):
    def minMoves2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        n = len(nums)
        base1, base2 = nums[(n + 1) / 2 - 1], nums[n / 2]
        tmp1, tmp2 = 0, 0
        for num in nums:
            tmp1 += abs(base1 - num)
            tmp2 += abs(base2 - num)
        return min(tmp1, tmp2)

results matching ""

    No results matching ""