【Leetcode】第33场双周赛T1558 得到目标数组的最少函数调用次数

题目


给你一个与 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;
    }

猜你喜欢

转载自blog.csdn.net/qq_41279172/article/details/108185372