給定乙個長度為 n 的整數列表 nums,其中 n > 1,返回輸出列表 res ,其中 res[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。
例如:給定乙個列表:[1, 2, 3, 4],返回結果:[24, 12, 8, 6]
注意:實現過程中,不允許使用 除法 ,且要求時間複雜度為o(n)
第乙個數
第二個數
第三個數
第四個數
給定列表的所有元素12
34當前元素左側部分的乘積11
1 * 2
1 * 2 * 3
當前元素右側部分的乘積
2 * 3 * 4
3 * 441
左乘積 * 右乘積
1 * 2 * 3 * 4
1 * 3 * 4
1 * 2 * 4
1 * 2 * 3 * 1
計算最終結果
241286
def productexceptself(nums):
res =
left_product_list, right_product_list = [1], [1]
left_product, right_product = 1, 1
for i in range(1, len(nums)): # 從第乙個元素開始,計算每個元素左側的所有元素的乘積
left_product *= nums[i - 1]
for i in range(len(nums) - 2, -1, -1): # 從倒數第二個元素開始,計算每個元素右側的所有元素的乘積
right_product *= nums[i + 1]
for i in range(len(nums)): # 注意 left_product_list 是正序計算,right_product_list 是倒序計算
left, right = left_product_list[i], right_product_list[len(nums) - 1 - i]
return res
上面的實現方式中,我們專門定義了兩個列表:left_product_list、right_product_list,分別記錄左側元素乘積、右側元素乘積,這裡的空間複雜度是 o(n),如果我們不考慮返回列表空間的話,那麼其實可以針對上方**進行優化,讓其空間複雜度降到 常數級別 o(1):
def productexceptself(nums):
res = [1] * len(nums)
left_product, right_product = 1, 1
for i in range(1, len(nums)): # 從第乙個元素開始,計算每個元素左側的所有元素的乘積
left_product *= nums[i - 1]
res[i] *= left_product
for i in range(len(nums) - 2, -1, -1): # 從倒數第二個元素開始,計算每個元素右側的所有元素的乘積
right_product *= nums[i + 1]
res[i] *= right_product
return res
上面的實現方式中,我們不再專門使用額外的列表來儲存左右側元素乘積,而是將最終返回列表設定為乙個固定長度的列表,接著直接修改列表中的元素值,如此一來,如果不考慮返回列表空間的前提下,其空間複雜度就降到 o(1)。
從上面的**中,可以發現我們對列表進行了2次遍歷,第一次正序遍歷是為了計算左乘積,第二次倒序遍歷是為了計算右乘積,在這裡其實我們也可以繼續優化,僅通過一次遍歷來完成,最終優化後**如下:
def productexceptself(nums):
"""針對 [1, 2, 3, 4] ,遍歷過程中,每個元素的左右累積均相乘
i=0, res[0]乘左累積,res[3]乘右累積;
i=1, res[1]乘左累積,res[2]乘右累積;
i=2, res[2]乘左累積,res[1]乘右累積;
i=3, res[3]乘左累積,res[0]乘右累積
"""res = [1] * len(nums)
left_product, right_product = 1, 1
for i in range(len(nums)):
res[i] *= left_product
left_product *= nums[i] # 下標 i 位置元素的左側所有元素的累積
res[len(nums) - 1 - i] *= right_product
right_product *= nums[len(nums) - 1 - i] # 下標 len - 1 - i 位置元素的右側所有元素的累積
return res
python程式設計題彙總(持續更新中……) Leecode刷題 238 除自身以外陣列的乘積
給定長度為 n 的整數陣列 nums,其中 n 1,返回輸出陣列 output 其中 output i 等於 nums 中除 nums i 之外其餘各元素的乘積。示例 輸入 1,2,3,4 輸出 24,12,8,6 說明 請不要使用除法,且在 o n 時間複雜度內完成此題。高階 你可以在常數空間複雜...
LeetCode刷題之238 除自身以外陣列的乘積
我不知道將去向何方,但我已在路上!輸入 1,2,3,4 輸出 24,12,8,6 class solution def productexceptself self,nums list int list int left val,right val 1 len nums 1 len nums res...
刷題篇 除自身以外陣列的乘積
leetcode 238.除自身以外陣列的乘積。該題要求不能使用除法,這類題基本就是找規律的問題,他可能沒有固定套路或解法,是需要我們積累的。下面是解題關鍵,不乘本身相當於將本身的數換成了1 resres 0 1nums 1 nums n 2 nums n 1 res 1 nums 0 1 nums...