Leetcode # 486. Predict the Winner
https://leetcode.com/problems/predict-the-winner
Solution (Recursive)
Time Complexity: O(2 ** len(nums))
Space Complexity: O(len(nums))
(The input and output generally do not count towards the space complexity.)
class Solution: def PredictTheWinner(self, nums: List[int]) -> bool: def predict_winner(nums): if len(nums) == 1: return nums[0] return max(nums[ 0] - predict_winner(nums[ 1:]), nums[-1] - predict_winner(nums[:-1])) return predict_winner(nums) >= 0
Solution (DP – Memoization (Top-Down))
在上一個 Solution 中存在著重複的計算
例:
nums = [1, 2, 3, 4, 5]
⇒ [1] + [2, 3, 4, 5] ⇒ [1] + ([2, 3, 4] + [5])
⇒ [1, 2, 3, 4] + [5] ⇒ ([1] + [2, 3, 4]) + [5]
所以我們使用 Memoization 保存已計算過的結果
Time Complexity: O(len(nums) ** 2)
Space Complexity: O(len(nums) ** 2)
(The input and output generally do not count towards the space complexity.)
class Solution: def PredictTheWinner(self, nums: List[int]) -> bool: self.dp = {(i, i): nums[i] for i in range(len(nums))} def predict_winner(start, end): if (start, end) not in self.dp: result = max(nums[start] - predict_winner(start + 1, end), nums[ end] - predict_winner(start, end - 1)) self.dp[(start, end)] = result return self.dp[(start, end)] return predict_winner(0, len(nums) - 1) >= 0
Solution: Space-Optimized (Bottom-Up)
curr: dp[(0, k)], dp[(1, k + 1)], dp[(2, k + 2)], …, dp[(N – k – 1), (N – 1)]
next: dp[(0, k + 1)], dp[(1, k + 2)], dp[(2, k + 3)], …, dp[(N – k – 2 ), (N – 1)]
- dp[(0, k + 1)] = max(num[k + 1] – dp[(0, k)], num[0] – dp[1, k + 1])
⇒dp[(0, k)]dp[(0, k + 1)], dp[(1, k + 1)], dp[(2, k + 2)], …, dp[(N – k – 1), (N – 1)] - dp[(1, k + 2)] = max(num[k + 2] – dp[(1, k + 1)], num[1] – dp[2, k + 2])
⇒ dp[(0, k + 1)],dp[(1, k + 1)]dp[(1, k + 2)] , dp[(2, k + 2)], …, dp[(N – k – 1), (N – 1)] - …
- dp[(0, k + 1)], dp[(1, k + 2)], dp[(2, k + 3)], …,
dp[(N – k – 1), (N – 1)]dp[(N – k – 2 ), (N – 1)],dp[(N – k – 1), (N – 1)]
每次我們依序計算出一個 next 的新項目
就會有一個 curr 的項目不會再被使用
所以我們可以將該項目的空間讓給新項目
(最後每一輪結束時還會額外多出一個空間)
註:dp = [n for n in nums]nums[:]
Time Complexity: O(len(nums) ** 2)
Space Complexity: O(len(nums))
(The input and output generally do not count towards the space complexity.)
class Solution: def PredictTheWinner(self, nums: List[int]) -> bool: dp = nums[:] for l in range(1, len(nums)): for i in range(len(nums) - l): dp[i]= max((nums[i] - dp[i + 1]), nums[i + l] - dp[i]) return dp[0] >= 0
Last Updated on 2023/08/16 by A1go