給你乙個長度為 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 時間複雜度內完成此題。高階 你可以在常...