46. Permutations - cocoder39/coco39_LC GitHub Wiki
notes 2024:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
num_set = set()
res = []
self.helper(nums, num_set, [], res)
return res
def helper(self, nums, num_set, path, res):
if len(path) == len(nums):
res.append(path[:])
return
for num in nums:
if num not in num_set:
num_set.add(num)
path.append(num)
self.helper(nums, num_set, path, res)
path.pop()
num_set.remove(num)
Notes 2020:
Solution 1 (Preferred since same approach can be applied to PermutationsII)
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
counters = collections.Counter(nums)
self.backtrack(counters, len(nums), [], res)
return res
def backtrack(self, counters, k, path, res):
if len(path) == k:
res.append(path[:])
return
for num in counters:
if counters[num] > 0:
path.append(num)
counters[num] -= 1
self.backtrack(counters, k, path, res)
path.pop()
counters[num] += 1
Solution 2
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
self.backtrack(nums, 0, res)
return res
def backtrack(self, nums, start, res):
if start == len(nums):
res.append(nums[:])
return
for i in range(start, len(nums)):
nums[start], nums[i] = nums[i], nums[start]
self.backtrack(nums, start+1, res)
nums[start], nums[i] = nums[i], nums[start]
Time complexity: There are N! solutions in res. For each element in in each solution, there are 3 operations (i.e., 2 swaps and 1 copy). The total time complexity is O(N * N!)
======================================================================================================
permutation of [1, 2, 3] are
[1] + permutation of [2, 3]
[2] + permutation of [1, 3]
[3] + permutation of [1, 2]
permutation of [2, 3] are
[2] + [3]
[3] + [2]
t(n) = n * t(n - 1) = n * (n - 1) * t(n - 2) ... = O(n!)
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
helper(res, nums, 0);
return res;
}
private:
void helper(vector<vector<int>>& res, vector<int>& nums, int start) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
swap(nums[i], nums[start]);
helper(res, nums, start + 1);
swap(nums[i], nums[start]);
}
}
};
t(n) = O(n) + n * t(n - 1)
t(n - 1) = O(n) + (n - 1) * t(n - 2)
t(n) = O(n! + n ^ 2) = O(n!)
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
vector<bool> visited(nums.size());
helper(res, cur, visited, nums);
return res;
}
void helper(vector<vector<int>>& res, vector<int>& cur, vector<bool>& visited, vector<int>& nums) {
if (cur.size() == nums.size()) {
res.push_back(cur);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (! visited[i]) {
visited[i] = true;
cur.push_back(nums[i]);
helper(res, cur, visited, nums);
cur.pop_back();
visited[i] = false;
}
}
}
};