题目描述
给定一个数组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长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
牛客链接:
https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&&tqId=11204&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解题思路:
有多种方法,目前提供三种:
第一种,用双层for循环,先计算A[0]A[1]…A[i-1],再计算A[i+1]…*A[n-1]
第二种:分两步:1.计算前i - 1个元素的乘积,及后N - i个元素的乘积分别保存在两个数组中。这可以用动态规划实现。2.计算B[i]的值。
第三种:B[i]=A[0]A[1]…*A[i-1]A[i+1]…A[n-1],从左到右算 B[i]=A[0]A[1]…A[i-1],从右到左算B[i]=A[i+1]…*A[n-1]
参考链接:
https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46
代码一:
时间复杂度为o(n*n)
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int len = A.size();
vector<int> result;
int multi1 = 1;
int multi2 = 1;
for(int i=-1; i<len-1; i++) {
if(i>0) {
multi1 = multi1*A[i];
}
multi2 = 1;
for(int j=i+2; j<len; j++) {
multi2 = multi2*A[j];
}
result.push_back(multi2*multi1);
}
return result;
}
};
代码二:
时间复杂度为o(n),辅助空间复杂度为o(n)
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int len = A.size();
vector<int> result(len);
vector<int> begin(len);
vector<int> end(len);
begin[0] = 1;
end[0] = 1;
for(int i=1; i<len; i++) {
begin[i] = A[i-1]*begin[i-1];
end[i] = A[len-i]*end[i-1];
}
for(int i=0; i<len; i++) {
result[i] = begin[i] * end[len-i-1];
}
return result;
}
};
代码三:
时间复杂度为o(n),辅助空间复杂度为o(1)
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int len = A.size();
vector<int> result(len);
int ret = 1;
for(int i=0; i<len; i++) {
result[i] = ret;
ret = ret*A[i];
}
ret=1;
for(int i=len-1; i>=0; i--) {
result[i] = result[i]*ret;
ret = ret*A[i];
}
return result;
}
};