前往
大廳
主題

LeetCode - 238. Product of Array Except Self 解題心得

Not In My Back Yard | 2022-05-21 12:00:13 | 巴幣 2 | 人氣 322

題目連結:


題目意譯:
給定一個整數陣列 nums,回傳一陣列 answer 使得 answer[i] 等於除了 nums[i] 以外所有元素之乘積。

nums 的任意前綴或後綴之乘積必可以容納進一個 32 位元之整數中。

你必須撰寫一演算法使得其執行時間為 O(n) 且不得使用任何除法運算。

限制:
2 ≦ nums.length ≦ 105
-30 ≦ nums[i] ≦ 30
nums 的任意前綴或後綴之乘積必可以容納進一個 32 位元之整數中。

進階:你可以在 O(1) 額外空間複雜度的情況下解出來嗎?(輸出的陣列不算做空間複雜度分析內的額外空間)



範例測資:
範例 1:
輸入: nums = [1,2,3,4]
輸出: [24,12,8,6]

範例 2:
輸入: nums = [-1,1,0,-3,3]
輸出: [0,0,9,0,0]


解題思維:
可以看到 answer[i] 之值可以被分成兩個部分:
第一個是「前綴」,即 nums[0] × nums[1] × …… × nums[i - 1](如果 i = 0,則此部分值為 1);
第二個則是「後綴」,即 nums[i + 1] × nums[i + 2] × …… × nums[nums.length - 1](如果 i = nums.length - 1,則此部分值為 1)

因此我們可以分兩趟跑,一次求每個位置的前綴、一次是求後綴。因此此時的問題便成為了求前綴乘積的問題,而該問題基本上與前綴和(Prefix Sums)相同,如這題。也就是 O(nums.length) 便可以求得前綴(後綴)乘積,且只需 O(1) 額外空間。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作