453.最小操作次数使数组元素相等:两次遍历(反向思维)

【LetMeFly】453.最小操作次数使数组元素相等:两次遍历(反向思维)

力扣题目链接:https://leetcode.cn/problems/minimum-moves-to-equal-array-elements/

给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。

 

示例 1:

输入:nums = [1,2,3]
输出:3
解释:
只需要3次操作(注意每次操作会增加两个元素的值):
[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

示例 2:

输入:nums = [1,1,1]
输出:0

 

提示:

  • n == nums.length
  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 答案保证符合 32-bit 整数

解题方法:遍历

想要使所有数相等,每次操作会使$n-1$个数$+1$,等价于每次操作会使得$1$个数$-1$。

首先遍历一遍数组得到最小元素,再遍历一遍数组将每个元素与最小元素的差值累加即为答案。

  • 时间复杂度$O(n)$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
* @LastEditTime: 2026-11-01 10:58:17
*/
class Solution {
public:
int minMoves(vector<int>& nums) {
int m = nums[0];
for (int t : nums) {
m = min(m, t);
}
int ans = 0;
for (int t : nums) {
ans += t - m;
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
'''
LastEditTime: 2026-11-01 11:00:17
'''
from typing import List

class Solution:
def minMoves(self, nums: List[int]) -> int:
m = min(nums)
return sum(t - m for t in nums)

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* @LastEditTime: 2026-11-01 11:01:07
*/
class Solution {
public int minMoves(int[] nums) {
int m = nums[0];
for (int t : nums) {
m = Math.min(m, t);
}
int ans = 0;
for (int t : nums) {
ans += t - m;
}
return ans;
}
}

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
* @LastEditTime: 2026-11-01 10:59:44
*/
package main

func minMoves(nums []int) (ans int) {
m := nums[0]
for _, t := range nums {
m = min(t, m)
}
for _, t := range nums {
ans += t - m
}
return
}

Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* @LastEditTime: 2026-11-01 11:01:46
*/
impl Solution {
pub fn min_moves(nums: Vec<i32>) -> i32 {
let mut m = nums[0];
for &t in nums.iter() {
m = m.min(t);
}
let mut ans = 0;
for &t in nums.iter() {
ans += t - m;
}
ans
}
}

End

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


453.最小操作次数使数组元素相等:两次遍历(反向思维)
https://blog.letmefly.xyz/2026/11/01/LeetCode 0453.最小操作次数使数组元素相等/
作者
发布于
2026年11月1日
许可协议