题目名称:使数组中所有元素都等于零
给你一个非负整数数组 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 <= 1000 <= 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;
}
结果
算法复杂度分析
- 时间复杂度:
- 空间复杂度: