版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1054513777/article/details/52644018
先上题目:
题目大意:
给一数组。返回一数组,这个数组对应原数组除了对应数其他数的乘积和。注意为额外的O(n)空间
技巧:
题目中已经明确把最容易想到的求所有数乘积,然后分别除每一个数的简单做法给否定了,因为这个也太没技术含量了。。。
这里要提及一个经常用到的概念,前缀和后缀,这个概念对很多程序有至关重要的意义以后如果要介绍KMP算法,其中就用到了字符串前缀和后缀的匹配。其实前缀和后缀顾名思义我们可以把数组中特定一位元素,如i位元素,规定i之前的元素乘积和为i的前缀积,同理i之后的元素乘积和为i的后缀积,显然输出的数组为前缀积数组再乘上后缀积数组对应的元素。
如下图所示
示例代码:
在实例代码中,我只用了两个vector数组,一个是结果的,一个是原有的,这破坏了原有的nums中的值,如果题目没有要保持原有数组的要求的话,这种实现又节省了一定的额外空间。
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> prefix;
int size = nums.size();
prefix.push_back(1); // 初值赋为1很关键
for (int i = 1; i < size; i++) {
int temp = prefix[i-1]*nums[i-1];
prefix.push_back(temp);
}
int templast = nums[size-1]; // 这里要记录即将被修改的nums数组值
nums[size-1]=1;
for (int i = 1; i < size; i++) {
int temp = nums[size-i]*templast;
templast = nums[size-i-1]; // 更新templast的值
nums[size-i-1] = temp;
}
for (int i = 0; i < size; i++) {
prefix[i] *= nums[i];
}
return prefix;
}
};
int main() {
Solution s;
vector<int> temp;
int n;
cin >> n;
cout << endl << endl;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
temp.push_back(x);
}
vector<int> printarray = s.productExceptSelf(temp);
for (int i = 0; i < printarray.size(); i++) {
cout << printarray[i] << " ";
}
cout << endl;
getchar();
getchar();
return 0;
}