您的位置:首页 > 其它

【leetCode】Product of Array Except Self

2015-08-01 16:03 295 查看
题目:

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

中文翻译过来就是:

给一个数组/vector<int>,比如这里的(管他叫 nums吧) [1,2,3,4] ;然后输出一个数组output,输出数组的每一个元素的值,是原来nums中除这个位置以外所有元素的乘积。比如,output[0]
== 24;对应到nums就是 nums[1]*nums[2]*nums[3]的乘积。

但是!题目要求,不允许使用除法!!!换句话说,试图将nums中所有元素乘起来再分别除以每一个元素的值是不允许的;

自己之前写的超时了。看了别人的答案,觉得还是不够直观就再改了下,用空间换时间的办法写了个自己的解法。

思路如下:

首先,定义一个跟nums一样长度的vector a1,对nums”从左到右“遍历, a1中每一个位置 i 上的元素都是nums中位置 i 之前所有元素的乘积。当然,a1[0]因为左边没有元素,所以等于1;

其次。定义一个跟nums一样长度的vector a2,对nums”从右到左“遍历, a2中每一个位置 i 上的元素都是nums中位置
i 之后所有元素的乘积。当然,a2[nums.size()-1]因为右边没有元素,所以等于1;

示意图:



这样我们就有了每一个元素左边和右边的所有值的乘积,再把这两个值乘起来就可以啦。

翠花,上代码~

class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> a1(nums.size(),1);//存放每一个数左边所有数的乘积,0号元素直接 “1”
vector<int> a2(nums.size(),1);//存放每一个数右边所有数的乘积,size()-1号元素直接“1”
vector<int> r(nums.size(), 1);//结果
vector<int>::size_type length=nums.size();
for (decltype(length) i = 0; i < length; i++)
{
if (i == 0)
a1[i] =  1;
else
a1[i] = a1[i - 1] * nums[i - 1];
}
//cout << "a1 complete" << endl;
//注意,这里的j不要定义为length的类型了。不然循环会报错的
for (int j = length - 1; j >= 0; j--)
{

//cout << "j==" << j << endl;
if (j == length - 1)
a2[j] = 1;
else
a2[j] = a2[j + 1] * nums[j + 1];
}
//cout << "a2 complete" << endl;
for (decltype(length) i = 0; i < length; i++)
{
r[i] = a1[i] * a2[i];
}
return r;
}
};

真是个令人沮丧的成绩...........

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