Minimum moves to equal elements II

看了下九章的公众号才记起来有这个题... 这道题跟1的不同就在于每次操作是对单独一个数加一或者减一,然后求最少操作数,因为1里面是任意n-1个数加一相当于最大数减一,这里的话可加可减,所以我们的基准数就变成了中位数,然后怎么找中位数呢?quickselect啊,下面是代码

class Solution(object):
    def minMoves2(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        median = self.quickSel(nums, 0, n - 1, (n + 1) / 2)

        result = 0
        for num in nums:
            result += abs(num - median)

        return result

    def quickSel(self, nums, start, end, k):
        if start >= end:
            return nums[end]

        left, right = start, end
        pivot = nums[left + (right - left) / 2]

        while left <= right:
            while left <= right and nums[left] > pivot:
                left += 1
            while left <= right and nums[right] < pivot:
                right -= 1
            if left <= right:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
                right -= 1

        if start + k - 1 <= right:
            return self.quickSel(nums, start, right, k)
        if start + k - 1 >= left:
            return self.quickSel(nums, left, end, k - (left - start))

        return nums[right + 1]

results matching ""

    No results matching ""