LC2357-使数组中所有元素都等于零

113 阅读2分钟

题目名称:使数组中所有元素都等于零

给你一个非负整数数组 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

思路分析

一个用来寻找数组中最小的x;另一个是让数组中每一个正数减去x;第二个函数调用的次数即输出结果,写了个死循环,又写了个判断数组是否为全0的函数,用来跳出循环。求解过程很不优雅,多次出现bug,都是考虑不全导致的。

将数组进行升序排列,然后遍历数组,若当前位置元素已经等于0,则直接跳过该元素,继续遍历下一个元素,若元素非零,则步数+1,且将剩余元素减去当前元素数值,重复以上步骤,直至遍历完所有元素。

差分数组中不为0的个数即为最小次数 原因:差分数组中位置i的数有变动,都会对原数组中位置i后的数产生影响。当差分数组全为0,则原数组也全为0;

Code实现

public int minimumOperations(int[] nums) {
    Arrays.sort(nums);
    int ans = 0;
    ans += nums[0] == 0 ? 0 : 1;
    for (int i = 1; i < nums.length; ++i) {
        if (nums[i] - nums[i - 1] != 0) {
            ans += 1;
        }
    }
    return ans;
}

结果

97ls1.png

算法复杂度分析

  • 时间复杂度:O(nlogn)O(nlogn)
  • 空间复杂度:O(1)O(1)