class Solution {
public:
int minOperations(vector<int>& nums) {
}
};
100032. 使数组为空的最少操作次数
给你一个下标从 0 开始的正整数数组 nums
。
你可以对数组执行以下两种操作 任意次 :
请你返回使数组为空的 最少 操作次数,如果无法达成,请返回 -1
。
示例 1:
输入:nums = [2,3,3,2,2,4,2,3,4] 输出:4 解释:我们可以执行以下操作使数组为空: - 对下标为 0 和 3 的元素执行第一种操作,得到 nums = [3,3,2,4,2,3,4] 。 - 对下标为 2 和 4 的元素执行第一种操作,得到 nums = [3,3,4,3,4] 。 - 对下标为 0 ,1 和 3 的元素执行第二种操作,得到 nums = [4,4] 。 - 对下标为 0 和 1 的元素执行第一种操作,得到 nums = [] 。 至少需要 4 步操作使数组为空。
示例 2:
输入:nums = [2,1,2,2,3,3] 输出:-1 解释:无法使数组为空。
提示:
2 <= nums.length <= 105
1 <= nums[i] <= 106
原站题解
python3 解法, 执行用时: 84 ms, 内存消耗: 31.7 MB, 提交时间: 2023-10-02 00:11:00
class Solution: def minOperations(self, nums: List[int]) -> int: cnt = Counter(nums) if 1 in cnt.values(): return -1 return sum((c + 2) // 3 for c in cnt.values())
java 解法, 执行用时: 21 ms, 内存消耗: 54.3 MB, 提交时间: 2023-10-02 00:10:49
class Solution { public int minOperations(int[] nums) { var cnt = new HashMap<Integer, Integer>(); for (int x : nums) { cnt.merge(x, 1, Integer::sum); } int ans = 0; for (int c : cnt.values()) { if (c == 1) { return -1; } ans += (c + 2) / 3; } return ans; } }
cpp 解法, 执行用时: 120 ms, 内存消耗: 83.3 MB, 提交时间: 2023-10-02 00:10:39
class Solution { public: int minOperations(vector<int> &nums) { unordered_map<int, int> cnt; for (int x : nums) { cnt[x]++; } int ans = 0; for (auto &[_, c] : cnt) { if (c == 1) { return -1; } ans += (c + 2) / 3; } return ans; } };
golang 解法, 执行用时: 92 ms, 内存消耗: 9.1 MB, 提交时间: 2023-10-02 00:10:28
func minOperations(nums []int) (ans int) { cnt := map[int]int{} for _, x := range nums { cnt[x]++ } for _, c := range cnt { if c == 1 { return -1 } ans += (c + 2) / 3 } return }