给你一个非负整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/make-array-zero-by-subtracting-equal-amounts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的答案:无
第一次看算法题确实是思路比较混乱的,只想着先输出数组的长度,然后找到数组中最小的数依次减去,处理后的数组再返回上个步骤,直到找到的最小值为0,输出处理的次数。但是这样写出来的代码不仅长而且非常的乱并且回过头看时又觉得逻辑上有点说不通,写着写着就迷了。
在评论中看到一个比较简易能看懂的答案是
class Solution {
public int minimumOperations(int[] nums) {
Arrays.sort(nums);
int ans = 0;
int sum = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] > sum) {
sum = nums[i];
ans++;
}
}
return ans;
}
}
看到这个答案的时候还是比较惊叹的,工整又简洁,比起我之前的思路要简单不少,理解时也很简单:
首先明确思路就是找不同正整数的个数
第一步就是排列数组,这里运用了一个我不知道的方法就是Arrays.sort(),这个方法能直接将数组按从小到大排列,减少了很多工作量,接下来就是简单的if比较找到最后的答案了。
回看题目与代码觉得这道题确实很简单,但是我没有做出来的原因就是缺少转化问题的想法,如果按照我一开始的思路这个过程确实会非常麻烦,但是将问题转化过后仅仅几行代码就能完成。并且也要运用各种方法来简化代码,多去寻找各种没有使用过的方法并加以运用。希望在以后的每日一题中我能积累这种转化问题的办法并得以运用。
后面还看见了个一行代码
public int minimumOperations(int[] nums) {
return (int)Arrays.stream(nums).filter(i -> i != 0).distinct().count();
}
不得不感叹确实人外有人。