开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情
刷题的日常-2023年2月24号
一天一题,保持脑子清爽
使数组中所有元素都等于零
来自leetcode的 2357 题,题意如下:
给你一个非负整数数组 nums 。在一步操作中,你必须:
- 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。
- nums 中的每个正整数都减去 x。
返回使 nums 中所有元素都等于 0 需要的 最少 操作数。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个数组,数组里的值大小不超过 100
- 要求我们每次选出一个最小的数(不包括零)
- 然后对每个非零的数减去这个最小的数
- 返回我们将所有的数变为零的最小操作次数
做题思路
题目很直接,规则都给出来了。我们可以直接暴力模拟题目的规则,每次都获取最小的一个数,然后对每个非零值减去最小值,最后没有大于零的就返回。
用暴力当然可以解决,不过这里可以有另外一种思路。通过暴力,每次都需要获取最小的一个值,然后再每个数去减。其实可以发现,每次都会和前面的数不一样,总会大一点。因此题目可以转换为统计数组中存在多少个数是不相同,并且是大于零的。那么就简单了,我们做个映射就行,步骤如下。
- 开辟一个大小为 101 的数组做映射
- 循环每个数
- 如果大于零就继续
- 如果没有出现过,就将映射数组修改为true,然后将结果加一
- 最后返回结果即可
代码实现
代码实现如下:
public class Solution {
public int minimumOperations(int... nums) {
int res = 0;
boolean[] map = new boolean[101];
for (int num : nums) {
if (num == 0) {
continue;
}
if (map[num]) {
continue;
}
map[num] = true;
res++;
}
return res;
}
}