刷题的日常-使数组中所有元素都等于零

161 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png