LeetCode 238 product of array except self 除自身以外陣列的乘積
阿新 • • 發佈:2018-11-07
題目連結
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; } }