Python程式設計題42 除自身以外元素的乘積

2022-09-09 17:06:28 字數 2505 閱讀 4320

給定乙個長度為 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...