为了满足题目额外要求而变复杂的题目

171 阅读1分钟

除自身以外数组的乘积

题目

image.png

版本1 正确

    public int[] productExceptSelf(int[] nums) {

        // 一个数组, 返回除了当前元素之外, 其它元素的乘积
        // 如果不做额外要求, 其实很简单, 将所有元素乘起来, 然后除以每个位置的元素, 得到的就是答案.
        // 但是如果额外要求不能使用除法, 同时不实用额外空间的话, 就需要取巧了

        // 本质是利用一个数组left记录索引i左边所有元素的乘积, 对于索引i右边的元素, 同样用一个数组right记录i右边所有元素乘积
        // 这样计算i位置的时候, 就是left[i - 1] * right[i - 1], 这样就没使用乘法
        // 如果要求不使用额外空间的话, 就用答案数组记录left, 然后右边的元素, 每次累乘即可

        int [] ans = new int[nums.length];
        ans [0] = nums[0];
        for (int i = 1; i < nums.length; i ++) {
            ans[i] = ans[i - 1] * nums[i];
        }

        // 计算每个位置的结果
        // 为了利用ans中的前缀乘积, 因此在最后给ans赋值的时候, 应该从后往前赋值
        int R = 1;
        for (int i = nums.length - 1; i >= 0; i --) {
            int temp = i > 0 ? ans[i - 1] : 1;
            if (i + 1 < nums.length) {
                R = R * nums[i + 1];
            }
            ans[i] = temp * R;

        }

        return ans;

    }

正确的原因

(1) 为了满足不使用除法, 同时不使用额外空间, 增加了问题的复杂性

(1) 利用答案数组来保存前缀乘积, 然后右边的乘积通过一个元素累乘保存即可