453. 最小移动次数使数组元素相等

一、题目

给定一个长度为 n非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动将会使 n - 1 个元素增加 1。

示例:

输入:
[1,2,3]

输出:
3

解释:
只需要3次移动(注意每次移动会增加两个元素的值):

[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

二、题解

  • n个数中,有n-1个数+1 等价于 第n个数-1

    • //[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
      //[1,2,3]  =>  [1,2,2]  =>  [1,2,1]  =>  [1,1,1]
      
  • 每次移动有1个数-1,最终数组中所有值都为最小值

    • 因此找到数组中每个元素与最小值的差值之和,即为要移动的次数
    • 如[5, 2, 1]中,5, 2与最小值1的差值为4,1因此要移动4+1次
  • 优化——出现数值相等的情况,不移动,没有值变化,因此可以跳过不用计算

class Solution {
    public int minMoves(int[] nums) {
            int count = 0;
            int min = nums[0];

            for (int i = 1; i < nums.length; i++) {
                min = Math.min(min,nums[i]);
            }
            for (int i = nums.length-1; i >= 0 ; i--) {
                if (nums[i]>min) {
                    count += (nums[i]-min);
                }
            }

            return count;
    }
}
  • 时间复杂度O(n)
  • 空间复杂度O(1)
  • 执行用时:2 ms, 在所有 Java 提交中击败了84.39%的用户
  • 内存消耗:38.9 MB, 在所有 Java 提交中击败了91.15%的用户
posted @ 2020-10-28 17:14  球球z  阅读(113)  评论(0)    收藏  举报