题目描述
给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
解题思路:
题目的意思是在累乘是将A[i]不乘
参考代码:(时间复杂度为O(n2))
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> B;
if (A.empty())
return B;
B.resize(A.size());
for (int i = 0; i < A.size(); ++i) {
B[i] = 1;
for (int j = 0; j < A.size(); ++j) {
if (i != j)
B[i] *= A[j];
}
// cout<<B[i]<<endl;
}
for (int k = 0; k < B.size(); ++k) {
cout<<"B:"<<B[k]<<endl;
}
}
};
int main() {
Solution solution;
vector<int> my_v;
my_v.push_back(1);
my_v.push_back(2);
my_v.push_back(3);
my_v.push_back(4);
my_v.push_back(5);
solution.multiply(my_v);
return 0;
}
优化代码:(时间复杂度为O(n))
//总体思路是将相乘元素分成一个矩阵形式,中间对角线都是1,可以看成左右两个数组,c[i]和d[i]
//后边再将两个数组相乘
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
vector<int> res(a.size(),1);
if(a.empty())
return res;
vector<int> c(a.size(),0);
c[0] = 1;
for(int i = 1; i < a.size(); i++)
{
c[i] = c[i-1]*a[i-1];
}
vector<int> d(a.size(),0);
d[a.size()-1] = 1;
for(int i = a.size()-2; i >= 0; i--)
{
d[i] = d[i+1] * a[i+1];
}
for(int i = 0; i < a.size(); i++)
{
res[i] = c[i]*d[i];
}
return res;
}
};