2019.2.18 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
既然规定了不能用除法,说明这道题肯定要取巧做。我们可以考虑一个矩阵Bm(),矩阵每一个对应一个乘积项,构建数组B的每一个元素相当于矩阵Bm每一行所有元素连乘的乘积。从而构建的矩阵形式如下:
例如数组B的第i个元素为矩阵Bm第i行所有元素的乘积(第i列元素用1代替)——B[i]=A[0]*A[1]*...*A[i-1]*1*A[i+1]*...*A[n-1]。
观察可以发现矩阵存在规律的上下三角,上下三角乘积和每一项以前一项为基础逐次递增,可以很容易通过复杂度为o(n)的两个for循环分别求得两个上下三角数组,再将两个数组对应相乘即可求出最终数组B。
题目描述
给定一个数组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]。不能使用除法。
Java实现:
/**
*
* @author ChopinXBP
* 给定一个数组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]。不能使用除法。
*
*/
public class Multiply_50 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] input = {1, 2, 3};
int[] result = multiply(input);
for(int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}
public static int[] multiply(int[] A) {
if(A == null || A.length == 0)return null;
int length = A.length;
int[] resultup = new int[length]; //矩阵上三角
int[] resultdown = new int[length]; //矩阵下三角
//计算上三角
resultup[length - 1] = 1;
int num = length - 1;
for(int i = length - 2; i >= 0; i--) {
resultup[i] = resultup[i + 1] * A[num--];
}
//计算下三角
resultdown[0] = 1;
num = 0;
for(int i = 1; i < length; i++) {
resultdown[i] = resultdown[i - 1] * A[num++];
}
//合并矩阵
for(int i = 0; i < length; i++) {
resultup[i] = resultup[i] * resultdown[i];
}
return resultup;
}
}
C++实现示例:
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int n = A.size();
vector<int> B0(n, 1);
vector<int> B1(n, 1);
for (int i = 1; i < n;++i)
{
B0[i] = B0[i - 1] * A[i - 1];
}
for (int i = n - 2; i >= 0;--i)
{
B1[i] = B1[i + 1] * A[i + 1];
}
vector<int> B(n, 1);
for (int i = 0; i < n;++i)
{
B[i] = B0[i] * B1[i];
}
return B;
}
};
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#