[LeetCode]238. 除自身以外數組的乘積

題目

給你一個長度爲 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章