leetcode 238 除自身以外陣列的乘積

2021-10-08 18:03:19 字數 1606 閱讀 2350

給你乙個長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

示例:輸入: [1,2,3,4]

輸出: [24,12,8,6]

說明: 請不要使用除法,且在 o(n) 時間複雜度內完成此題。

高階:你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出陣列不被視為額外空間。)

class solution(object):

def productexceptself(self, nums):

""":type nums: list[int]

:rtype: list[int]

"""n = len(nums)

left = [0] * n

right = [0] * n

left[0] = 1

for i in range(1,n):

left[i] = left[i-1] * nums[i-1]

right[-1] = 1

for i in reversed(range(n-1)):

right[i] = right[i+1] * nums[i+1]

res =

for i in range(n):

return res

由於我們不能使用除法,所以最簡單的把所有數相乘然後除於第i個數不能使用,因此可以將其拆分為兩部分,對i前面的數字進行累乘,然後對i後面的數字進行累乘就能得到我們想要的答案。我們可以儲存兩個列表l和r,l[i]表示第i個數前面數字累乘,r[i]相反。那麼l[0]應該等於1,l[1] = l[0]*nums[0],以此類推,l[i] = l[i-1]*nums[i-1],r[i] = r[i+1]*nums[i+1]。最後再進行一遍迴圈,將l[i]與r[i]相乘起來就能得到對應的答案。

class solution(object):

def productexceptself(self, nums):

""":type nums: list[int]

:rtype: list[int]

"""n = len(nums)

left = [0] * n

left[0] = 1

for i in range(1,n):

left[i] = left[i-1] * nums[i-1]

right = 1

for i in reversed(range(n)):

left[i] = left[i] * right

right = right * nums[i]

return left

其實我們只需要乙個left陣列就夠了,並且經過處理可以直接用於返回結果。我們需要乙個right變數來替代之前的right陣列。當我們獲得left陣列之後我們從後往前遍歷,結果值為原來的left[i]再乘以right,其中left[i]表示i之前的乘積,而right表示i之後的乘積。那麼對於第乙個right而言即最右邊的right,第乙個值應為1,然後每次遍歷right * nums[i]。這樣right的功能就和之前的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 時間複雜度內完成此題。高階 你可以在常...