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)