Leetcode P238 Java使用DP解决此问题
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:49.8 MB, 在所有 Java 提交中击败了20.79%的用户
ideas
首先我们要创建2个dp一个负责记录从左向右的乘积,一个负责从右到左的乘积
int[] ldp = new int[nums.length];
int[] rdp = new int[nums.length];
接下来我们对此dp数组进行初始化,让他们记录乘积
ldp[0] = nums[0];
rdp[nums.length-1] = nums[nums.length-1];
for (int i = 1; i < ldp.length; i++) {
ldp[i] = ldp[i-1] * nums[i];
}
for (int i = rdp.length-2; i >= 0 ; i--) {
rdp[i] = rdp[i+1] * nums[i];
}
接下来考虑下返回的数组边界问题,如果下标为0那么就要从右向左的下标为1的数据,如果下标是数组长度-1那么就是从左向右第数组长度-2的乘积。
//设置0和数组最后一位的数据
res[0] = rdp[1];
res[res.length-1] = ldp[res.length-2];
接下来考虑下特殊情况,如果数组长度只有2个,那么就直接返回此res
if (res.length == 2){
return res;
}
接下来开始遍历此res,为每个下标记录他的除了它本身其他数的乘积
res[i] = ldp[i-1] * rdp[i+1];
code
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] ldp = new int[nums.length];
int[] rdp = new int[nums.length];
int[] res = new int[nums.length];
//初始化dp
ldp[0] = nums[0];
rdp[nums.length-1] = nums[nums.length-1];
for (int i = 1; i < ldp.length; i++) {
ldp[i] = ldp[i-1] * nums[i];
}
for (int i = rdp.length-2; i >= 0 ; i--) {
rdp[i] = rdp[i+1] * nums[i];
}
//设置0和数组最后一位的数据
res[0] = rdp[1];
res[res.length-1] = ldp[res.length-2];
if (res.length == 2){
return res;
}
for (int i = 1; i < res.length-1; i++) {
res[i] = ldp[i-1] * rdp[i+1];
}
return res;
}
}