def product(nums):
n=len(nums); res=[1]*n; l=1
for i in range(n): res[i]=l; l*=nums[i]
r=1
for i in range(n-1,-1,-1): res[i]*=r; r*=nums[i]
return res
public int[] productExceptSelf(int[] nums){
int n=nums.length; int[] res=new int[n]; Arrays.fill(res,1);
int l=1;
for(int i=0;i<n;i++){res[i]=l;l*=nums[i];}
int r=1;
for(int i=n-1;i>=0;i--){res[i]*=r;r*=nums[i];}
return res;
}
[1]*n vs Arrays.fill(). Two-pass technique identical.
def product(nums):
n=len(nums); res=[1]*n; l=1
for i in range(n): res[i]=l; l*=nums[i]
r=1
for i in range(n-1,-1,-1): res[i]*=r; r*=nums[i]
return res
public int[] productExceptSelf(int[] nums){
int n=nums.length; int[] res=new int[n]; Arrays.fill(res,1);
int l=1;
for(int i=0;i<n;i++){res[i]=l;l*=nums[i];}
int r=1;
for(int i=n-1;i>=0;i--){res[i]*=r;r*=nums[i];}
return res;
}
1. Left pass prefix products 2. Right pass suffix products