思路
考察动态规划,使用dp数组保存已计算的结果
Code
简洁写法:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int n = A.length;
int[] B = new int[n];
for(int i = 0 , product = 1; i < n; product *= A[i] ,i++) //从左往右类乘
B[i] = product;
for(int i = n-1, product = 1; i >= 0; product *= A[i] , i--)
B[i] *= product;
return B;
}
} 稍多:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] a) {
if(a.length == 0) return new int[0];
int[] b = new int[a.length];
b[0] = 1;
int tmp = 1;
for(int i = 1; i < a.length ; i++)
{
b[i] = b[i-1] * a[i-1];
}
for(int i = a.length - 2; i >= 0; i--)
{
tmp *= a[i+1];
b[i] *= tmp;
}
return b;
}
} 最常见:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
if(A == null || A.length == 0)
return A;
int len = A.length;
//维护2个DP数组
int[] left = new int[len];
int[] right = new int[len];
left[0] = right[len-1] = 1;
for(int i = 1 ; i< len; i++)
{
left[i] = left[i-1] * A[i-1];
}
for(int i = len - 2; i >= 0; i--)
right[i] = right[i+1] * A[i+1];
int[] ret = new int[len];
for(int i = 0; i < len; i++)
ret[i] = left[i] * right[i];
return ret;
}
} 
京公网安备 11010502036488号