时间限制:1秒 空间限制:32768K 热度指数:158846
本题知识点: 数组
题目描述
给定一个数组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]。不能使用除法。
题目链接:题目链接
题目要求不能用乘法,刚开始想的时候,
觉得可以把A[0]*A[1]*...*A[i-1]*A[i]*A[i+1]*...A[n-1]算出来,
然后,再运用位运算,模拟除法。。。
1 A[2] A[3] A[4] A[5] A[6] A[1] 1 A[3] A[4] A[5] A[6] A[1] A[2] 1 A[4] A[5] A[6] A[1] A[2] A[3] 1 A[5] A[6] A[1] A[2] A[3] A[4] 1 A[6] A[1] A[2] A[3] A[4] A[5] 1 但是,牛油们更厉害,想了个更简单的,
我们现在要求的就是这个矩阵每一行的元素相乘所得的结果,
其中,这个矩阵很特殊,分上三角和下三角,对角线为1。
我们只要遍历两边A数组,第一遍求出下三角部分,第二遍再乘上上三角部分,就ok了。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector <int> result;
if(A.size() == 0) return result;
result.push_back(1);
for(int i=0;i<A.size()-1;i++){
//求出下三角部分
int temp = result[i]*A[i];
result.push_back(temp);
}
int temp = 1;
for(int i=result.size()-2;i>=0;i--){
//求出上三角部分
temp = A[i+1] * temp;
result[i] = result[i] * temp;
}
return result;
}
};