這個題目就是《劍指offer》上面的面試題66。剛開始就是按照上面的思路然後構造了兩個陣列pre和last,分別記錄從前往後的累乘積和從後往前的累乘積,然後再遍歷一次得到result,其中result[i] = pre[i-1] * last[i+1]
。**如下:
public
static
int[
]productexceptself
(int
nums)
int[
] result =
newint
[numlength]
;//得到result陣列
for(
int i =
1; i < numlength-1;
++i)
//兩端的值單獨處理
result[0]
= last[1]
; result[numlength-1]
= pre[numlength-2]
;return result;
}
當然這樣做的時間複雜度是o(2n)(或者o(n)),空間複雜度為o(2n),result不算在裡面。題目說能否使得空間複雜度為常量,思考一番還是無果,於是看了其他人的實現,也是看了好一會才懂。先看一下**:
public
static
int[
]productexceptself1
(int
nums)
return result;
}
主要是看看後面那個for迴圈,這裡很巧妙只遍歷了一次就計算出了所有結果。我們將這個步驟分為兩步:
首先分別計算左邊的累乘結果和右邊的累乘結果,直到左右指標相遇時。
然後右邊的指標就可以直接利用左邊的累乘結果更新左邊的結果,左邊的指標也可以利用右邊的累乘結果更新右邊的結果。
上乙個圖就能看的比較清晰。要知道left和right的更新只和nums有關,而result的更新則只與left、right都有關,綠色的線表示這一步要進行的乘法操作。
leetcode 238 除自身以外陣列的乘積
給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。高階 你可以在常數空間複雜...
leetcode238 除自身以外陣列的乘積
從左到右遍歷一趟,記錄每個位置左邊的乘積 首位為1 從右到左走一趟,將上一步的結果累乘每一位右邊的乘積 class solution object def productexceptself self,nums if not nums return output 1 len nums k 1 for...
LeetCode 238 除自身以外陣列的乘積
題目描述 給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。高階 你可以在常...