link: https://leetcode.com/problems/permutations-ii/
用Counter記錄每個數字出現了幾次,在排列時同個數字就會當成同一類。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
counter = Counter(nums)
result = []
def backtracking(path):
if len(path) == n:
result.append(path)
return
for num in counter:
if counter[num] > 0:
counter[num] -= 1
backtracking(path + [num])
counter[num] += 1
backtracking([])
return result
用swap的方式。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
def dfs(n_idx):
if n_idx == n-1:
res.append(nums[:])
return
seen_set = set()
for i in range(n_idx, n):
if nums[i] in seen_set:
continue
nums[n_idx], nums[i] = nums[i], nums[n_idx]
dfs(n_idx+1)
nums[n_idx], nums[i] = nums[i], nums[n_idx]
seen_set.add(nums[i])
dfs(0)
return res
leetcode
link: https://leetcode.com/problems/
Feb 9, 2024Difficulty: Easy link: https://leetcode.com/problems/linked-list-cycle/ 1. Hash table $O(n)$ runtime, $O(n)$ space 用set紀錄看過的node,如果有重複就代表有cycle。 python # Definition for singly-linked list. # class ListNode:
Dec 28, 2022Difficulty: Medium link: https://leetcode.com/problems/distribute-coins-in-binary-tree/ 1. DFS $O(N)$ runtime, $O(H)$ space 定義dfs函數,計算以node為root的subtree,扣掉每個child node需要的1枚硬幣後,總共會多(或少)幾枚硬幣。 如果硬幣有多,回傳值就是正的;如果硬幣有缺,回傳值就是負的;剛剛好不多不缺的情況,回傳值為0。 dfs函數顯示,node最少還需要幾枚硬幣(缺硬幣的情況),或著node至少要給出幾枚硬幣(多硬幣的情況),才能達成題目要求的硬幣分布。
Nov 26, 2022Difficulty: Medium link: https://leetcode.com/problems/permutations/ 1. Backtracking $O(n!)$ runtime, $O(n)$ space 需要列出所有排列數,可以用backtracking。用take紀錄有沒有拿過nums的第i個元素。 python class Solution: def permute(self, nums: List[int]) -> List[List[int]]:
Nov 26, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up