[Leetcode] 238. Product of Array Except Self

这一题,o(n)的做法其实原理很简单,

result[i] = nums[0] * nums[1] * .. nums[i] * nums[i + 1]  * .. nums[n] / nums[i] = nums[0] * .. nums[i - 1] * nums[i + 1] * ... nums[n]
也就是说,算result[i],我们需要有两个部分一个是nums[0] * .. nums[i - 1],另一个是nums[i + 1] * .. nums[n]就可以了。
如果没有space的限制,那么我们只需要两个辅助数组即可,可以叫做productArray和reverseProductArray
其中,productArray[i] = nums[0] * nums[1] * .. nums[i]
reverseProductArray[i] = nums[i] * nums[i + 1] * ... nums[n]
然后每一个result[i] 就等于 productArray[i - 1] * reverseProductArray[i + 1]

原理摆在这儿了,代码就不写了(因为真的没写)。。。

至于说constant space。其中有一个trick,就是output array不算在额外空间。。所以除去nums这个数组,你还是可以有一个productArray或者reverseProductArray的。你只是在计算过程里,把productArray变成了结果返回了罢了。这个其实也不是很难,如果你已经有了一个productArray,那么当你算出result[n]的时候,你就已经不需要productArray[n - 1]了,甚至productArray[n]一开始就是不需要的。所以我们先拿到productArray,然后再开一个整型数就可以了,从 result[n]往前算到result[0]。这个整型数的作用就是动态构建reverseProductArray并且动态使用,当你算出来result[i]的时候,不仅productArray[i - 1]是不需要了,reverseProductArray[i + 1]也不需要了。所以关于reverseProductArray,你只需要一个reverseProductInt就可以了其实。
1. 先从result[n]开始算,算出来之后把它放在productArray[n]里,然后reverseProductInt就乘以nums[n]成为了reverseProductArray[n],同时你的productArray[n - 1]也变得不需要了可以解放了
2. 算result[n - 1]时,你拿出productArray[n - 2],此时你的reverseProductInt是nums[n],两者相乘,放到productArray[n - 1]里,此时productArray[n - 2]也解放了,你的reverseProductInt乘以nums[n - 1],此时reverseProductInt就等价于reverseProduct[n - 1]。
3. 如此类推从尾到头算....最后返回你的productArray(此时已经完全变成result了)。

给出代码如下:

    public int[] productExceptSelf(int[] nums) {
        int[] res = new int[nums.length];
        for (int i = res.length - 1; i >= 0; i--) {
            res[i] = nums[i] * ((i == res.length - 1) ? 1 : res[i + 1]);
        }
        
        int left = 1;
        for (int i = 0; i < res.length; i++) {
            res[i] = left * ((i == res.length - 1) ? 1 : res[i + 1]);
            left *= nums[i];
        }
        
        return res;
    }

这段代码是将结果数组一开始当成reverseProductArray,然后用一个整型数作为productInt来使用。也是一样的

就是先正扫再反扫或者先反扫在正扫都是可以的。

猜你喜欢

转载自blog.csdn.net/chaochen1407/article/details/81146679
今日推荐