力扣热题100道之238除自身以外数组的乘积
解法
解法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;}
}