剑指offer题解汇总 Java实现
https://blog.csdn.net/guliguliguliguli/article/details/126089434
本题链接
题目
思路 & 代码
方案一 最朴素思想 二重循环
import java.util.*;
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int[] B = new int[A.length];
int res;
for (int i = 0; i < A.length; i++) {
res = 1;
for (int j = 0; j < A.length; j++) {
if (i == j) {
continue;
}
res *= A[j];
}
B[i] = res;
}
return B;
}
}
方案二 双向遍历A数组
根据题意,B[i]数组的值是A数组中除了A[i]的所有数的乘积
构建下三角
所以,观察上图,可以将B[0]赋值为1,然后B[i] = B[i-1] x A[i-1],这样就完成了下三角的构建,此时
B[0] = 1
B[1] = 1 x A[0]
B[2] = B[1] x A[1] = 1 x A[0] x A[1]
…
构建上三角
用一个变量(代码中定义为res,初始化值为1)来存储从右往左遍历时,记录下每一项累积的乘积
最终遍历两次A数组就解决了,当数据量很大的时候,效率肯定是比方案一的二重循环的效率要高的
import java.util.*;
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int[] B = new int[A.length];
B[0] = 1;
//从左往右遍历A,构建下三角
for (int i = 1; i < A.length; i++) {
B[i] = B[i - 1] * A[i - 1];
}
//从右往左遍历A,构建上三角
//用一个变量来记录累成
int res = 1;
for (int i = A.length - 1; i >= 0; i--) {
B[i] *= res;
res *= A[i];
}
return B;
}
}