leetcode 462. 最少移动次数使数组元素相等 II

  1. 题目链接 https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements-ii/submissions/

  2. 题目描述

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

    1. 排序 -> 找到中位数 -> 所有数与中位数差值的和就是就是最少移动次数
    2. 不管是选中位数左边的数还是右边的数,得到的结果都不可能比选中位数小
  4. 代码

    1. python
      class Solution:
          def minMoves2(self, nums: List[int]) -> int:
              nums.sort()
              N = len(nums)
              num, m = nums[N // 2], N // 2
              
              return m * num - sum(nums[:m]) + sum(nums[m + 1:]) - (N - m - 1) * num  
                      
                      
  5. 总结

    1. 这道题一开始以为求状态转移的最短路径,想到用BFS。。。果断GG= =、

猜你喜欢

转载自blog.csdn.net/qq_38043440/article/details/88591712