您的位置:首页 > 其它

238. Product of Array Except Self &构建乘积数组

2016-02-26 22:08 411 查看

题目描述

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

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1] *…*A[i-1]*A[i+1]*…*A[n-1]。不能使用除法。

解答

  如果可以使用除法,可以使用公式

来求得B[i]。但是使用除法时,要特别注意A[i]等于0的情况。

  我们可以把B[i]=A[0]*A[1] *…*A[i-1]*A[i+1]*…*A[n-1]分成两部分,看作是A[0]*A[1] *…*A[i-1]和A[i+1]*…*A[n-1]两部分的乘积。所以B可以使用一个矩形来创建。

  


  定义C[i] =A[0]*A[1] *…*A[i-1],D[i]=A[i+1]*…*A[n-1]。C[i]可以使用自上而下的顺序计算出来,即C[i] = C[i-1]*A[i-1]。类似的,D[i]可以自下而上的计算,即D[i] = D[i+1]*A[i+1]。

vector<int> multiply(const vector<int>& A) {
vector<int> ret;
//注意resize和reserve
ret.resize(A.size());
for(int i = 0;i<ret.size();++i)
ret[i]=1;
ret[0] = 1;
//求C[i]
for(int i = 1;i < A.size();++i)
{
ret[i] *=ret[i-1]*A[i-1];
}
//使用tmp求D[i],并求最终结果
int tmp = 1;
for(int i = A.size()-2;i>=0;--i)
{
tmp *=A[i+1];
ret[i] *=tmp;
}
return ret;

}


class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {

vector<int> nums1(nums.size(),1);
vector<int> nums2(nums.size(),1);
vector<int> ret(nums.size(),1);

for(int i = 1;i<nums.size();++i)
{
nums1[i] = nums1[i-1] * nums[i-1];
}
for(int j = nums.size() -2;j>=0;--j)
{
nums2[j] = nums2[j+1] *nums[j+1];
}

for(int i = 0;i< nums.size();++i)
{
ret[i] = nums1[i] * nums2[i];
}

return ret;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: