日期:2026年11月1日
LeetCode 題目連結:453. Minimum Moves to Equal Array Elements
解題想法
中等難度題。題目給一個長度為 $n$ 的陣列 $nums$,每次操作可以將陣列中 $n-1$ 項各加上 $1$,至少要操作幾次才能夠讓陣列中每一項都一樣大?
這題考數學。如果原來的陣列中最小值為 $imin$,加總為 $isum$,假設要操作 $m$ 次,則陣列加總變成 $$ isum + m \times (n-1) = n \times (imin + m) \Rightarrow m = isum - n \times imin $$ 這題用 Python 或 C++ 都可以一行解。
Python 程式碼
Runtime: 1 ms, beats 89.24%. Memory: 20.34 MB, beats 87.24%.
class Solution:
def minMoves(self, nums: list[int]) -> int:
return sum(nums) - len(nums) * min(nums)
Runtime: 7 ms, beats 52.32%. Memory: 20.34 MB, beats 87.24%.
class Solution:
def minMoves(self, nums: list[int]) -> int:
isum, imin = 0, float('inf')
for num in nums:
isum += num
if num < imin:
imin = num
return isum - imin * len(nums)
C++ 程式碼
Runtime: 0 ms, beats 100.00%. Memory: 31.80 MB, beats 99.75%.
class Solution {
public:
int minMoves(vector<int>& nums) {
return accumulate(nums.begin(), nums.end(), 0) - nums.size() * (*min_element(nums.begin(), nums.end()));
}
};
Runtime: 0 ms, beats 100.00%. Memory: 31.90 MB, beats 97.11%.
class Solution {
public:
int minMoves(vector<int>& nums) {
int n = (int)nums.size(), imin = INT_MAX;
long isum = 0;
for(int num : nums) {
isum += num;
if (num < imin) imin = num;
}
return isum - n * imin;
}
};
C 語言程式碼
Runtime: 0 ms, beats 100.00%. Memory: 9.86 MB, beats 94.55%.
int minMoves(int* nums, int numsSize) {
int imin = INT_MAX;
long isum = 0;
for(int i = 0; i < numsSize; i++) {
isum += nums[i];
if (nums[i] < imin) imin = nums[i];
}
return isum - numsSize * imin;
}
沒有留言:
張貼留言