拿到这道题的时候,下意识的觉得很简单,但是自己动手去做的时候发现并没有我想象中简单,首先题目规定了不能使用除法运算,否则迭代相乘然后除以每个位置上的数就会很简单,且限定了时间复杂度为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);
对这道题的做法,我的解析还不够深入细节,我也没有完全理解这种做法,等我更进一步理解的时候,我再来更新这篇博客!
期待自己也能像你们一样强!