238.除自身外数组的乘积
题目描述
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
解法一:左右乘积
- 从左向右累乘,放进数组L[]
- 从右往左累乘,放进数组R[]
- 结果为L[]* R[]
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[] L=new int[n];
int[] R=new int[n];
L[0]=1;
R[n-1]=1;
for(int i=1;i<n;i++){
L[i]=L[i-1]*nums[i-1];
}
for(int i=n-2;i>=0;i--){
R[i]=R[i+1]*nums[i+1];
}
for(int i=0;i<n;i++){
nums[i]=L[i]*R[i];
}
return nums;
}
}
时间:O(N)
空间:O(N)
优化空间
- 用常数R代替当前的数组R,
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[] answer=new int[n];
answer[0]=1;
for(int i=1;i<n;i++){
answer[i]=answer[i-1]*nums[i-1];
}
int R=nums[n-1];
for(int i=n-2;i>=0;i--){
//遍历更新
answer[i]=answer[i]*R;
R*=nums[i];
}
return answer;
}
}