題目
給你一個長度爲 n 的整數數組 nums
,其中 n > 1,返回輸出數組 output
,其中 output[i]
等於 nums
中除 nums[i]
之外其餘各元素的乘積。
示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]
提示:題目數據保證數組之中任意元素的全部前綴元素和後綴(甚至是整個數組)的乘積都在 32 位整數範圍內。
說明: 請不要使用除法,且在 O(n) 時間複雜度內完成此題。
進階:
你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出數組不被視爲額外空間。)
解題思路
定義left,right兩個指針,初始值都爲1,分別用來計算第i個元素左右兩邊的累乘結果,那麼數組中除了第i個元素的其餘各元素的乘積就是第i個元素左右兩邊的乘積再相乘。
複雜度分析:
時間複雜度:O(N),其中 N 指的是數組 nums 的大小。
空間複雜度:O(1),輸出數組不算進空間複雜度中,因此我們只需要常數的空間存放變量。
代碼
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int left = 1, right = 1;
int[] res = new int[n];
for(int i=0; i<n; i++){
res[i] = 1;
}
for(int i=0; i<n; i++){
// 乘以左邊的乘積
res[i] *= left;
// 更新左邊的乘積
left *= nums[i];
// 乘以右邊的乘積
res[n-i-1] *= right;
// 更新右邊的乘積
right *= nums[n-i-1];
}
return res;
}
}