题目:
给定一个数组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]。不能使用除法。
方法一:
逐个相乘,在第i个的时候跳过
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
int len=A.size();
vector<int>result;
for(int i=0;i<len;i++)
{
int tmp=1;
for(int j=0;j<len;j++)
{
if(i==j)
continue;
else
tmp=tmp*A[j];
}
result.push_back(tmp);
}
return result;
}
};
时间复杂度:O(n*n)
方法二:
建立两个容器,分别放置A[0]A[1]…A[i-1]和A[i+1]…*A[n-1]的值,再求两个容器中对应元素的乘积
对于任意一个i值
B1[i] =A[0]A[1]…*A[i-1] =B1[i-1]*A[i-1]
B2[i] =A[i+1]*…*A[n-1] =B2[i+1]*A[i+1]
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
int n=A.size();
vector<int>result(n,1); //初始化为1
vector<int>B1(n,1);
vector<int>B2(n,1);
for(int i=1;i<n;i++)
B1[i]=B1[i-1]*A[i-1];
for(int i=n-2;i>=0;i--)
B2[i]=B2[i+1]*A[i+1];
for(int i=0;i<n;i++)
result[i]=B1[i]*B2[i];
return result;
}
};
时间复杂度:O(n),空间复杂度:O(n)
方法三:
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
int n=A.size();
vector<int>result(n); //初始化长度
int tmp=1;
for(int i=0;i<n;tmp=tmp*A[i++]) //关键是for语句中的第三条语句,因为它是在循环体之后执行的
result[i]=tmp;
tmp=1;
for(int i=n-1;i>=0;tmp=tmp*A[i--])
result[i]=result[i]*tmp;
return result;
}
};
时间复杂度:O(n),空间复杂度:O(1)