AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 453. Minimum Moves to Equal Array Elements    原题链接    简单

作者: 作者的头像   wzc1995 ,  2018-06-27 00:31:06 ,  所有人可见 ,  阅读 1188


4


1

题目描述

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

样例

输入:
[1,2,3]

输出:
3

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

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

算法

(数学) $O(n)$
  1. 每次令 n - 1 个元素的值加 1,相当于对一个元素减 1。
  2. 故只需要找到最小的元素值 min_x,让其他大于它的元素减少到 min_x。
  3. 具体地,让所有元素的总和 tot 减去 n * min_x。
  4. 可以直接使 用C++ STL中的 accumulate 和 min_element 。

时间复杂度

  • 求最小值和求和的时间复杂度都是 $O(n)$,故总时间复杂度为 $O(n)$。

空间复杂度

  • 仅需要常数的额外空间。

C++ 代码

class Solution {
public:
    int minMoves(vector<int>& nums) {
        return accumulate(nums.begin(), nums.end(), 0) 
            - nums.size() * *min_element(nums.begin(), nums.end());
    }
};

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息