-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path46_medium_[back_track_or_recursive]_permutations.py
58 lines (43 loc) · 1.58 KB
/
46_medium_[back_track_or_recursive]_permutations.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from typing import List
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def remove_and_return_new_list(nums: List[int], val: int) -> List[int]:
new_list = []
for num in nums:
if num == val:
continue
new_list.append(num)
return new_list
def permute_recursive(nums: List[int]) -> List[List[int]]:
if len(nums) == 1:
return [nums]
permutations = []
for num in nums:
altered_nums = remove_and_return_new_list(nums, num)
for per in permute_recursive(altered_nums):
permutations.append([num] + per)
return permutations
if len(nums) == 0:
return [[]]
return permute_recursive(nums)
class Solution:
def backtrack(self, nums, used_nums_set, state, answer) -> None:
if len(nums) == len(state):
answer.append(state)
return
for num in nums:
if num in used_nums_set:
continue
used_nums_set.add(num)
self.backtrack(nums, used_nums_set, state + [num], answer)
used_nums_set.remove(num)
def permute(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return [[]]
answer = []
self.backtrack(nums, set(), [], answer)
return answer
if __name__ == '__main__':
print(Solution().permute([1]))
print(Solution().permute([1,2]))
print(Solution().permute([1,2,3]))