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]