先写一种暴力解法。使用二重循环遍历数组,将对应结果插入结果集。
这种做法时间复杂度为O(n^2),空间复杂度O(1),显然还有改进空间。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> result;
for(int i = 0;i < A.size();i++){
int temp = 1;
for(int j = 0;j < A.size();j++){
if(j != i){
temp *= A.at(j);
}
}
result.push_back(temp);
}
return result;
}
};
解析来考虑更好的解法。
观察结果的生成方式,发现结果的算式可以构成一个矩阵,且其对角线为全1,并且每一列在对角线之外的地方都相等。
发现其递推规律。从而得到以下解法。
先循环一次算出结果项在对角线左侧的值,在循环一次乘上右侧的值,即得结果。
其时间复杂度为O(n),空间复杂度为O(1)。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> result(A.size(),1);
for(int i = 1;i < A.size();i++){
result.at(i) = result.at(i - 1) * A.at(i - 1);
}
int temp = 1;
for(int i = A.size() - 2;i > -1;i--){
temp *= A.at(i + 1);
result.at(i) *= temp;
}
return result;
}
};