
解法
解法1:构建左右两边的乘积数组
l[0]=1,r[n-1]=1;然后 l[i]=l[i-1]*nums[i-1],r[j]=r[j+1]*nums[j+1]。
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[]l=new int[n];
int[]r=new int[n];
int[]result=new int[n];
l[0]=1;
r[n-1]=1;
int i=1;
int j=n-2;
while(i<n){
l[i]=l[i-1]*nums[i-1];
i++;
}
while(j>=0){
r[j]=r[j+1]*nums[j+1];
j--;
}
for(int p=0;p<n;p++){
result[p]=l[p]*r[p];
}
return result;
}
}
解法2:空间复杂度为O(1)的解法
将result数组(输出答案的数组)作为L数组,先将l数组求出来,然后定义一个变量r一直更新来代替r数组的功能。
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[]result=new int[n];
int i=1;
result[0]=1;
while(i<n){
result[i]=result[i-1]*nums[i-1];
i++;
}
int j=n-2;
int r=nums[n-1];
while(j>=0){
result[j]=result[j]*r;
r=r*nums[j];
j--;
}
return result;
}
}
历史解法
报错超出预期时间的解法
遍历数组,当不是当前遍历的元素的时候,找到其他元素的乘积。这种方法的时间复杂度是O(n2),不符合题意。
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[]result=new int[n];
int[]muls=new int[n-1];
for(int i=0;i<n;i++){
int mul=1;
for(int j=0;j<n;j++){
if(j!=i){
mul=mul*nums[j];
}
if(j==n-1||i==n-1&&j==n-2){
result[i]=mul;
}
}
}
return result;
}
}