【Leetcode解題】238. Product of Array Except Self
題目
- 題目連結
- 目標函式 :
productExceptSelf(nums)- Input :
nums: List[int] - Output :
List[int]
- Input :
解題概念
- 題意 : 給定一整數陣列
nums,需要回傳一陣列answer,使得answer[i]等於nums中除了nums[i]之外之所有元素的乘積- 其中時間複雜度需要為 $O(n)$,且不能使用除法
我的寫法
- 想法 : 先從左右各自算出各自的乘積,最後再將兩個陣列相乘
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14def productExceptSelf(self, nums):
left = [1 for _ in nums]
right = [1 for _ in nums]
for i in xrange(1, len(nums)):
left[i] = left[i - 1] * nums[i - 1]
for i in xrange(len(nums) - 2, -1, -1):
right[i] = right[i + 1] * nums[i + 1]
for i in xrange(len(nums)):
left[i] *= right[i]
return left - 成效 :
- Time Complexity : $O(n)$
- Runtime: 167 ms (faster than 68.59%)
- Memory Usage: 19.9 MB (more than 93.61%)
解答 or 其他優秀寫法 - Dynamic Programming
- 想法 : 應該使用 Dynamic Programming
- 使用
dp[0]~dp[amount]去紀錄從0到amount的最佳解 - 然後使用雙重迴圈 : 先針對每個可能
amount的值i,再針對每個coin - 若
i比coin大,即更新dp[i](決定計不計算coin,再取較小值min(dp[i], dp[i - coin] + 1)) - 若最後發現
dp[amount] == max_value,代表amount無解,則回傳-1
- 使用
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14def productExceptSelf(self, nums):
left = [1 for _ in nums]
right = [1 for _ in nums]
for i in xrange(1, len(nums)):
left[i] = left[i - 1] * nums[i - 1]
temp_right = 1
for i in xrange(len(nums) - 1, -1, -1):
left[i] *= temp_right
temp_right *= nums[i]
return left - 成效 :
- Time Complexity : $O(n)$
- Runtime: 166 ms (faster than 71.36%)
- Memory Usage: 19.1 MB (more than 96.88%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


