3190. 使所有元素都可以被 3 整除的最少操作数
题目描述
给你一个整数数组 nums
。一次操作中,你可以将 nums
中的 任意 一个元素增加或者减少 1 。
请你返回将 nums
中所有元素都可以被 3 整除的 最少 操作次数。
示例 1:
输入:nums = [1,2,3,4]
输出:3
解释:
通过以下 3 个操作,数组中的所有元素都可以被 3 整除:
- 将 1 减少 1 。
- 将 2 增加 1 。
- 将 4 减少 1 。
示例 2:
输入:nums = [3,6,9]
输出:0
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
解法
方法一:数学
我们直接遍历数组 $\textit{nums}$,对于每个元素 $x$,我们计算 $x$ 除以 3 的余数 $x \bmod 3$,如果余数不为 0,我们需要将 $x$ 变为能被 3 整除且操作次数最少,那么我们可以选择将 $x$ 减少 $x \bmod 3$ 或者增加 $3 - x \bmod 3$,取两者的最小值累加到答案中。
时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{nums}$ 的长度。空间复杂度 $O(1)$。
Python3
class Solution:
def minimumOperations(self, nums: List[int]) -> int:
ans = 0
for x in nums:
if mod := x % 3:
ans += min(mod, 3 - mod)
return ans
Java
class Solution {
public int minimumOperations(int[] nums) {
int ans = 0;
for (int x : nums) {
int mod = x % 3;
if (mod != 0) {
ans += Math.min(mod, 3 - mod);
}
}
return ans;
}
}
C++
class Solution {
public:
int minimumOperations(vector<int>& nums) {
int ans = 0;
for (int x : nums) {
int mod = x % 3;
if (mod) {
ans += min(mod, 3 - mod);
}
}
return ans;
}
};
Go
func minimumOperations(nums []int) (ans int) {
for _, x := range nums {
if mod := x % 3; mod > 0 {
ans += min(mod, 3-mod)
}
}
return
}
TypeScript
function minimumOperations(nums: number[]): number {
let ans = 0;
for (const x of nums) {
const mod = x % 3;
if (mod) {
ans += Math.min(mod, 3 - mod);
}
}
return ans;
}