1. 程式人生 > >LeetCode 238 product of array except self 除自身以外陣列的乘積

LeetCode 238 product of array except self 除自身以外陣列的乘積

題目連結

https://leetcode-cn.com/problems/product-of-array-except-self/

題意

        中文題,就是給出一個數組,輸出也是一個數組,每個位置是除自身外其他所有數的乘積。要求不能用除法,以及時間複雜度為O(n)。進階的條件是常數的空間複雜度。

題解

        也是比較有趣的題,不能用乘法,很想知道oj怎麼知道有沒有用除法,難道是看程式碼有沒有符號“*”麼= =。不過在O(n)時間複雜度下還是能寫出來的。能用除法的話,就是第一輪遍歷,直接求所有數的乘積,然後第二輪遍歷就除以原數得到答案。如果不能用除法,那麼就可以考慮,除了本身,將兩邊的乘積再相乘。不過這樣時間複雜度就是O(n^2)了。

        我的想法是,如果能遍歷兩輪,第一輪正常乘,第二輪反向正常乘,這樣對於i而言,[0,i-1]的就是左邊的正確乘積,那麼反向正常乘的時候,[i+1,len-1]的乘積就是右邊的正確乘積。同時為了滿足常數級的空間複雜度,第一輪正向就直接在答案陣列上進行,反向的時候,利用temp,反向直接確定正確答案。

        表達不太清楚感覺,直接擼程式碼吧,速度還是能保證的。

Java程式碼

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] ans = new int[len];
        ans[0] = nums[0];
        for(int i = 1;i < len-1;i++){
            ans[i] = nums[i]*ans[i-1];
        }
        ans[len-1] = ans[len-2];
        int temp = nums[len-1];
        for(int i = len-2;i >= 1;i--){
            ans[i] = ans[i-1]*temp;
            temp *= nums[i];
        }
        ans[0] = temp;
        return ans;
    }
}