一道算法题

原题链接:https://leetcode.com/problems/product-of-array-except-self/

题目大意:给一个数组,返回一个数组,要求返回的数组的第i个元素是原数组除了第i个元素的其他所有元素乘积。

例如给[1,2,3,4], 返回[24,12,8,6]

很容易想到先把所有数乘起来,然后每扫描到第i个元素时就用总乘积除以元素i,然而题目说了:不许用除法!另外还要求能否用常数级别的空间复杂度完成,返回的数组不算空间复杂度。

看到这种题目我总是会用一种类似动态规划的思想去考虑,就是先对原始数据做一些处理,前面的处理结果可以用于后续的处理。比如一开始的思路“把所有数乘起来”就是一个处理方式。这题虽然不许用除法,但是思路还是可以继续往这边想。
如果把原有数组里的数一个个乘起来,每乘到第i个元素时,就得到从0到i的所有元素乘积;那怎样获得从i到末尾的所有元素乘积呢?倒着再乘一遍就好了!从末尾开始一个个乘,每到i时就得到了末尾到i的所有乘积了。至于去掉元素i,只要乘的时候少乘一个数,扫描到i时乘到i-1就好了。

于是代码如下:

public int[] productExceptSelf(int[] nums) {
    int[] result = new int[nums.length];
    int temp = 1;
    for (int i=0; i<nums.length; i++) {
        if (i==0) {
            result[i]=1;
        }else {
            result[i]=result[i-1]*nums[i-1];
        }
    }
    for (int j=nums.length-1; j>=0; j--) {
        if (j!=nums.length-1) {
            temp *= nums[j+1];
            result[j] *= temp;
        }
    }
    return result;
}

后来看了别人的代码,思路一模一样,但是人家的写法不需要在i==0j==nums.length-1的时候做特别判断,果然自己在写代码的优雅程度上还是不够啊……