劍指offer____構建乘積陣列
阿新 • • 發佈:2018-11-17
給定一個數組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]。不能使用除法。
方法一:前後分離相乘
class Solution { public: vector<int> multiply(const vector<int>& A) { vector<int> b; if(A.size() == 0) return b; b.resize(A.size()); int end = A.size() - 1; int tmp = 1; //第一次前向累乘 b[0] = 1; for(int i =0;i<A.size()-1;i++) { tmp *= A[i]; b[i+1] = tmp; } //第二次後向累乘 tmp = 1; for (int i = end; i > 0; i--) { tmp *= A[i]; b[i-1] *= tmp; } return b; } };
方法二:除法
class Solution{ public: int mult(const vector<int>& A ,int pos) { int result = 1; for(int i = 0; i < pos; ++i) { result *= A[i]; } for(int i = pos + 1; i < A.size(); ++i) { result *= A[i]; } return result; } int decedt(const vector<int>& A,int *pos) { int count = 0; for(int i = 0; i < A.size(); ++i ) { if(A[i] == 0) { *pos = i; count++; } } return count; } vector<int> multiply(const vector<int>& A) { vector<int> res(A.size(),0); int pos = -1; int zero = decedt(A,&pos); if(zero > 1) { return res; } if(zero == 1) { res[pos] = mult(A,pos); return res; } int count = mult(A ,-1); for(int i = 0; i < A.size(); ++i) { res[i] = count / A[i]; } return res; } };