Welcome to Subscribe On Youtube
46. Permutations
Description
Given an array nums
of distinct integers, return all the possible permutations. You can return the answer in any order.
Example 1:
Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Example 2:
Input: nums = [0,1] Output: [[0,1],[1,0]]
Example 3:
Input: nums = [1] Output: [[1]]
Constraints:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
- All the integers of
nums
are unique.
Solutions
Solution 1: DFS (Backtracking)
We design a function $dfs(i)$ to represent that the first $i$ positions have been filled, and now we need to fill the $i+1$ position. We enumerate all possible numbers, if this number has not been filled, we fill in this number, and then continue to fill the next position, until all positions are filled.
The time complexity is $O(n \times n!)$, where $n$ is the length of the array. There are $n!$ permutations in total, and each permutation takes $O(n)$ time to construct.
-
class Solution { private List<List<Integer>> ans = new ArrayList<>(); private List<Integer> t = new ArrayList<>(); private boolean[] vis; private int[] nums; public List<List<Integer>> permute(int[] nums) { this.nums = nums; vis = new boolean[nums.length]; dfs(0); return ans; } private void dfs(int i) { if (i == nums.length) { ans.add(new ArrayList<>(t)); return; } for (int j = 0; j < nums.length; ++j) { if (!vis[j]) { vis[j] = true; t.add(nums[j]); dfs(i + 1); t.remove(t.size() - 1); vis[j] = false; } } } }
-
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vector<vector<int>> ans; vector<int> t(n); vector<bool> vis(n); function<void(int)> dfs = [&](int i) { if (i == n) { ans.emplace_back(t); return; } for (int j = 0; j < n; ++j) { if (!vis[j]) { vis[j] = true; t[i] = nums[j]; dfs(i + 1); vis[j] = false; } } }; dfs(0); return ans; } };
-
''' remove an element by its value from a set >>> my_set = {1, 2, 3, 4, 5} >>> my_set.remove(3) >>> print(my_set) {1, 2, 4, 5} ------ cannot remove an element by index from a set in Python3 need to convert the set to a list >>> my_set = {1, 2, 3, 4, 5} >>> my_list = list(my_set) >>> del my_list[2] # remove the element at index 2 >>> my_set = set(my_list) >>> print(my_set) {1, 2, 4, 5} ''' class Solution: # iterative def permute(self, nums: List[int]) -> List[List[int]]: res = [[]] if nums is None or len(nums) == 0: return ans for num in nums: new_res = [] for perm in res: for i in range(len(perm) + 1): new_perm = perm[:i] + [num] + perm[i:] new_res.append(new_perm) res = new_res return res ############## class Solution: # iterative, single_perm.insert(index, num) def permute(self, nums: List[int]) -> List[List[int]]: ans = [[]] if nums is None or len(nums) == 0: return ans for num in nums: tmp_list = [] for single_perm in ans: for index in range(len(single_perm) + 1): single_perm.insert(index, num) tmp_list.append(single_perm.copy()) single_perm.pop(index) ans = tmp_list return ans ############## ''' In Python 3, both the discard() and remove() methods of a set object are used to remove an element from the set, but there is one key difference: * discard() removes the specified element from the set if it is present, but does nothing if the element is not present. * remove() removes the specified element from the set if it is present, but raises a KeyError exception if the element is not present. >>> a {33, 66, 11, 44, 22, 55} >>> a.discard(22) >>> a {33, 66, 11, 44, 55} >>> a.discard(200) >>> >>> a.remove(200) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 200 ''' ''' >>> v1 = set([]) >>> v2 = set() >>> >>> v1 set() >>> v2 set() ''' class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = [] visited = set([]) def dfs(nums, path, res, visited): if len(path) == len(nums): res.append(path + []) return for i in range(0, len(nums)): if i not in visited: visited.add(i) path.append(nums[i]) dfs(nums, path, res, visited) path.pop() visited.discard(i) # remove(i) will throw exception if i not existing dfs(nums, [], res, visited) return res ############ class Solution: def permute(self, nums: List[int]) -> List[List[int]]: def dfs(i): if i == n: ans.append(t[:]) return for j in range(n): if not vis[j]: vis[j] = True t[i] = nums[j] dfs(i + 1) vis[j] = False n = len(nums) vis = [False] * n t = [0] * n ans = [] dfs(0) return ans
-
func permute(nums []int) (ans [][]int) { n := len(nums) t := make([]int, n) vis := make([]bool, n) var dfs func(int) dfs = func(i int) { if i == n { ans = append(ans, slices.Clone(t)) return } for j, v := range nums { if !vis[j] { vis[j] = true t[i] = v dfs(i + 1) vis[j] = false } } } dfs(0) return }
-
function permute(nums: number[]): number[][] { const n = nums.length; const res: number[][] = []; const dfs = (i: number) => { if (i === n) { res.push([...nums]); } for (let j = i; j < n; j++) { [nums[i], nums[j]] = [nums[j], nums[i]]; dfs(i + 1); [nums[i], nums[j]] = [nums[j], nums[i]]; } }; dfs(0); return res; }
-
/** * @param {number[]} nums * @return {number[][]} */ var permute = function (nums) { const n = nums.length; const ans = []; const t = []; const vis = new Array(n).fill(false); function dfs(i) { if (i >= n) { ans.push([...t]); return; } for (let j = 0; j < n; ++j) { if (!vis[j]) { vis[j] = true; t.push(nums[j]); dfs(i + 1); vis[j] = false; t.pop(); } } } dfs(0); return ans; };
-
public class Solution { public IList<IList<int>> Permute(int[] nums) { var ans = new List<IList<int>>(); var t = new List<int>(); var vis = new bool[nums.Length]; dfs(nums, 0, t, vis, ans); return ans; } private void dfs(int[] nums, int i, IList<int> t, bool[] vis, IList<IList<int>> ans) { if (i >= nums.Length) { ans.Add(new List<int>(t)); return; } for (int j = 0; j < nums.Length; ++j) { if (!vis[j]) { vis[j] = true; t.Add(nums[j]); dfs(nums, i + 1, t, vis, ans); t.RemoveAt(t.Count - 1); vis[j] = false; } } } }
-
impl Solution { fn dfs(i: usize, nums: &mut Vec<i32>, res: &mut Vec<Vec<i32>>) { let n = nums.len(); if i == n { res.push(nums.clone()); return; } for j in i..n { nums.swap(i, j); Self::dfs(i + 1, nums, res); nums.swap(i, j); } } pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> { let mut res = vec![]; Self::dfs(0, &mut nums, &mut res); res } }