238. Product of Array Except Self

来源:互联网 发布:喀秋莎录屏软件9下载 编辑:程序博客网 时间:2024/05/16 07:13

Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Solve it without division and in O(n).

For example, given [1,2,3,4], return [24,12,8,6].

Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)

s思路:
1. 看起来又是个数学题。如何破题?每个数只能使用一次或固定次数,还不能用除法。
2. 仔细观察,如果把所有数乘起来后,分别除以每个位置的数然后就可以把这个结果覆盖这个位置原来的值,这样就不用额外空间来存储结果了,相当于空间复用;现在不让用除法,那么我们也不能空间复用,必须分配新的vector来存结果。
3. 太牛了,思维一放松,就出结果。下图,对[1,2,3,4],容易想到从左往右累乘得到[1,2,6,24],第一步想到这里比较容易,因为如果要找4对应的积,就是看24位置左边的累积6;但如果要找3对应的积,怎么办呢?也好办,3的左边的累积为2,然后把2乘以右边4;如果找2对应的积呢?就不容易看出来了,因为2的位置左边的累积为1,需要乘以右边的3*4的积。我注意到,我自己的思维第一次到这里的时候,就静止了,遇到这个问题就停摆了,没有想如何解决这个问题。最后应该是潜意识有招呼,多次训练有效果,发现这个问题可以这么解决:把每个位置的乘积建模成这个位置左侧的累积×这个位置右侧的累积,那么我们不但需要得到从左边开始的累积,还需要得到从右边开始的累积,如下图。这样,先two pass得到两个方向累积,然后再one pass选择左右两个累积再相乘就得到需要的位置的积,一共three pass。
这里写图片描述
4. 做的过程中,在脑海里刚开始是一片,然后做的过程中发现要分成两部分,即:每个位置的积等于这个位置两侧的累积相乘。熟悉这个了,下次遇到类似的,就要会建模,例如:刚开始看到时,2对应的乘积是1*3*4,看到这个就认为这是一个整体,但看久了,就看出来不是一个整体,因为中间有边界的地方,1是一部分,3*4又是一部分,所以能看出这个来,问题就解决了。
5. 看边界,能慢慢看出道道,同样是数据,能分析谁和谁是一个group,谁和谁是因为边界分开,找到边界,就从边界用功,这个思路可以好好运用。

//方法1:three passclass Solution {public:    vector<int> productExceptSelf(vector<int>& nums) {        //        int n=nums.size();        vector<int> res(n,1);        for(int i=0;i<n;i++){            res[i]=nums[i]*(i>0?res[i-1]:1);          }        for(int i=n-1;i>=0;i--){            nums[i]=nums[i]*(i<n-1?nums[i+1]:1);           }        /*int pre=1;        for(int i=0;i<n;i++){            int tmp=pre*(i<n-1?nums[i+1]:1);              pre=res[i];            res[i]=tmp;        }*/        //优化:上面的代码是从左往右遍历,发现要设置中间变量,因为有个数是不能直接覆盖,因为后面还需要用,因此就要一个中间变量来保存        //这种情况,按照以前讨论的方法,都是可以通过从右往左遍历来解决,因此不同角度看问题就很有趣!        for(int i=n-1;i>=0;i--){            res[i]=(i>0?res[i-1]:1)*(i<n-1?nums[i+1]:1);        }        return res;    }};
0 0
原创粉丝点击