leetcode No238. Product of Array Except Self

来源:互联网 发布:复杂网络画图软件 编辑:程序博客网 时间:2024/05/28 19:23
Question:

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].

Algorithm:

以0的个数讨论

1、先求所有非零元素的乘积mul,并求0元素的个数zero_num。

2、以零元素的个数讨论

(1)zero_num = 0,num[i] = mul/num[i];

(2)zero_num = 1,num[i] = mul(if num[i] == 0);num[i] = 0(if num[i] != 0)

(3)zero_num >1,num[i] = 0;

2017/3/3

以上是原来的解法,后来才注意到题目要求不能用除法。。。。

更新算法:

假设我们现在要求下标为i位置的元素的乘积,那么这个乘积是=前(0-i~1)个元素的乘积 * 后(i+1~n)的乘积

令前面的乘积为s[i],后面的乘积为t[i],s[i]=s[i-1]*nums[i-1],t[i]=t[i+1]*nums[i+1]

所以只需从头到尾,从尾到头的扫描一遍就可以得到数组s[]和t[],进而得到结果

Accepted Code:

class Solution {public:    vector<int> productExceptSelf(vector<int>& nums) {        vector<int> res;        if(nums.size() < 1)            return res;        vector<int> front(nums.size(),1);        vector<int> back(nums.size(),1);        for(int i=1;i<nums.size();i++)        {            front[i]=front[i-1]*nums[i-1];            back[nums.size()-i-1]=back[nums.size()-i]*nums[nums.size()-i];        }        for(int i=0;i<nums.size();i++)        {            res.push_back(front[i]*back[i]);        }        return res;    }};

看到排名较高的算法,只需一遍遍历就可以得到结果,而且空间复杂度为O(1),即用两个数来表示s[]和t[]

自己照着思路写了一下,beats 96.63%

class Solution {public:    vector<int> productExceptSelf(vector<int>& nums) {        int N=nums.size();        vector<int> res(N,1);        int frontProduct=1;        int backProduct=1;        for(int i=0;i<N;i++)        {            res[i]*=frontProduct;            frontProduct*=nums[i];            res[N-1-i]*=backProduct;            backProduct*=nums[N-1-i];        }                return res;    }};





0 0
原创粉丝点击