题目描述
给你一个长度为 n
的整数数组 nums
,其中 n > 1
,返回输出数组 output ,其中
output[i]等于
nums中除
nums[i]` 之外其余各元素的乘积。
样例
输入: [1,2,3,4]
输出: [24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
算法分析
- 1、用两个数组维护前缀积和后缀积,即
left[i]
维护的是[0,i]
的前缀积,right[i]
维护的是[i,n - 1]
的后缀积 - 2、若计算
nums[i]
之外其余各元素的乘积,等价于计算left[i - 1] * right[i + 1]
时间复杂度 $O(n)$
空间复杂度 $O(n)$
空间复杂度是常数级别的情况 wzc1995 大佬的题解
Java 代码
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] left = new int[n];
int[] right = new int[n];
for(int i = 0;i < n;i ++)
{
if(i == 0) left[i] = nums[i];
else left[i] = left[i - 1] * nums[i];
}
for(int i = n - 1;i >= 0;i --)
{
if(i == n - 1) right[i] = nums[i];
else right[i] = right[i + 1] * nums[i];
}
int[] res = new int[n];
for(int i = 0;i < n;i ++)
{
int t = 1;
if(i - 1 >= 0) t *= left[i - 1];
if(i + 1 <= n - 1) t *= right[i + 1];
res[i] = t;
}
return res;
}
}