1. 程式人生 > 其它 >LeetCode238 除自身以外陣列的乘積

LeetCode238 除自身以外陣列的乘積

題目

給你一個長度為n的整數陣列nums,其中n > 1,返回輸出陣列output,其中 output[i]等於nums中除nums[i]之外其餘各元素的乘積。

示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]

提示:題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內。

說明: 請不要使用除法,且在O(n) 時間複雜度內完成此題。

進階:
你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出陣列不被視為額外空間。)

方法

左右乘積列表法

由於題目中規定不能使用除法,因此我們分別用陣列記錄當前下標左邊和右邊的乘積,然後再相乘

  • 時間複雜度:O(n),n為陣列長度
  • 空間複雜度:O(n),n為陣列長度
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int length = nums.length;
        int[] left = new int[length],right = new int[length];
        left[0] = 1;
        right[length-1]=1;
        for(int i=1;i<length;i++){
            left[i] = left[i-1]*nums[i-1];
            right[length-1-i] = right[length-i]*nums[length-i];
        }
        int[] result = new int[length];
        for(int i=0;i<length;i++){
            result[i] = left[i]*right[i];
        }
        return result;
    }
}

左右乘積優化法

對左右乘積列表進行優化,先將左邊乘積存入返回結果的陣列,然後用單個變數儲存右側乘積,並與返回結果列表中的左側乘積計算更新返回列表

  • 時間複雜度:O(n),n為陣列長度
  • 空間複雜度:O(1)
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int length = nums.length;
        int[] result = new int[length];
        result[0] = 1;
        for(int i=1;i<length;i++){
            result[i] = result[i-1]*nums[i-1];
        }
        int right = 1;
        for(int i=length-1;i>=0;i--){
            result[i] = result[i]*right;
            right *= nums[i];
        }
        return result;
    }
}