题目
给你一个与 nums 大小相同且初始值全为 0 的数组 arr ,请你调用以上函数得到整数数组 nums 。
请你返回将 arr 变成 nums 的最少函数调用次数。
答案保证在 32 位有符号整数以内。
思路
参考了这位巨巨的思路。zerotrac
正向思考不行就反向思考,把问题转换为将nums采用单个-1或全部除以2的操作全变为0的最小步数。
对偶数来说,除以2的操作优于-1。对奇数来说,先减1再除以2的操作最优。所以可以先将nums数组中的奇数先全部转换为偶数,再对整个数组除以2。重复这个过程直到数组所有元素为0。
代码
public int minOperations(int[] nums) {
int result = 0;
boolean flag = false, chu = false;
while (true) {
for (int i = 0; i < nums.length; i++) {
if(nums[i] % 2 == 1) {
nums[i] --;
result ++;
flag = true;
}
if(nums[i] != 0 && nums[i] % 2 == 0) {
nums[i] >>= 1;
chu = true;
}
}
if(!flag && !chu)
break;
if(chu == true) {
result ++;
chu = false;
}
flag = false;
}
return result;
}