给你一个非负整数数组 nums
。在一步操作中,你必须:
- 选出一个正整数
x
,x
需要小于或等于nums
中 最小 的 非零 元素。 nums
中的每个正整数都减去x
。
返回使 nums
中所有元素都等于 0
需要的 最少 操作数。
示例 1:
输入:nums = [1,5,0,3,5] 输出:3 解释: 第一步操作:选出 x = 1 ,之后 nums = [0,4,0,2,4] 。 第二步操作:选出 x = 2 ,之后 nums = [0,2,0,0,2] 。 第三步操作:选出 x = 2 ,之后 nums = [0,0,0,0,0] 。
示例 2:
输入:nums = [0] 输出:0 解释:nums 中的每个元素都已经是 0 ,所以不需要执行任何操作。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
我们观察到,每一次操作,都可以把数组 nums
中相同且非零的元素减少到 nums
中有多少个不同的非零元素,即为最少操作数。统计不同的非零元素,可以使用哈希表或数组来实现。
时间复杂度
class Solution:
def minimumOperations(self, nums: List[int]) -> int:
return len({x for x in nums if x})
class Solution {
public int minimumOperations(int[] nums) {
boolean[] s = new boolean[101];
s[0] = true;
int ans = 0;
for (int x : nums) {
if (!s[x]) {
++ans;
s[x] = true;
}
}
return ans;
}
}
class Solution {
public:
int minimumOperations(vector<int>& nums) {
bool s[101]{};
s[0] = true;
int ans = 0;
for (int& x : nums) {
if (!s[x]) {
++ans;
s[x] = true;
}
}
return ans;
}
};
func minimumOperations(nums []int) (ans int) {
s := [101]bool{true}
for _, x := range nums {
if !s[x] {
s[x] = true
ans++
}
}
return
}
function minimumOperations(nums: number[]): number {
const set = new Set(nums);
set.delete(0);
return set.size;
}
use std::collections::HashSet;
impl Solution {
pub fn minimum_operations(nums: Vec<i32>) -> i32 {
let mut set = nums.iter().collect::<HashSet<&i32>>();
set.remove(&0);
set.len() as i32
}
}
int minimumOperations(int* nums, int numsSize) {
int vis[101] = {0};
vis[0] = 1;
int ans = 0;
for (int i = 0; i < numsSize; i++) {
if (vis[nums[i]]) {
continue;
}
vis[nums[i]] = 1;
ans++;
}
return ans;
}