LeetCode:除自身以外数组的乘积

拿到这道题的时候,下意识的觉得很简单,但是自己动手去做的时候发现并没有我想象中简单,首先题目规定了不能使用除法运算,否则迭代相乘然后除以每个位置上的数就会很简单,且限定了时间复杂度为O(n),所以无法使用双重for循环。

于是找到一位博客园的博主的解法来学习,代码如下:

vector<int> Solution::productExceptSelf(vector<int>& nums)
{
	int n = nums.size();
	vector<int> fwd(n, 1), bwd(n, 1), res(n);
	for (int i = 0; i < n - 1; ++i) {
		fwd[i + 1] = fwd[i] * nums[i];
	}
	for (int i = n - 1; i > 0; --i) {
		bwd[i - 1] = bwd[i] * nums[i];
	}
	for (int i = 0; i < n; ++i) {
		res[i] = fwd[i] * bwd[i];
	}
	return res;
}

乘以除本身以外其余元素可以理解为 res[i] == nums[0]*nums[1]*....num[i-1]*nums[i+1]*....nums[size-1],该博主的解法利用两个数组分别一个向后“偏移”,一个向前"偏移"的做法,使得每个元素上的乘法恰好少了num[i]!

以传入[1,2,3,4]为例

在没有‘除本身’之前,res:[1*2*3*4,1*2*3*4,1*2*3*4,1*2*3*4]

fwd中装载的元素:[   1,  1,2,6]

bwd中装载的元素:[24,12,4,1]

在fwd[i]*bwd[i]的时候,答案就出现了!以res[1]~res[3]为例:

res[1] = 1*3*4(2);
res[2] = 1*2*4(3);

res[3] = 1*2*3(4);

对这道题的做法,我的解析还不够深入细节,我也没有完全理解这种做法,等我更进一步理解的时候,我再来更新这篇博客!

期待自己也能像你们一样强!

猜你喜欢

转载自blog.csdn.net/qq_26818479/article/details/83047314
今日推荐