classSolution { public: vector<vector<int>> permute(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> res; do { res.push_back(nums); } while (next(nums)); return res; }
boolnext(vector<int> &A){ int n = A.size(); int x = 0, y = 0; for (int i = n - 1; i > 0; --i) { if (A[i - 1] < A[i]) { x = i - 1; y = i; break; // 说明从i开始后边全降序 } } if (y == 0) returnfalse; for (int i = n - 1; i > x; --i) { if (A[i] > A[x]) { swap(A[i], A[x]); // 找到下一个比A[x]大的开始下一轮遍历 break; } } reverse(A.begin() + y, A.end()); returntrue; } };
backtracking O(n*n!) time
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defpermute(self, nums: List[int]) -> List[List[int]]: nums.sort() n, res = len(nums), [] defdfs(A, b): if b == n: res.append(A) return for i inrange(b, n): A[i], A[b] = A[b], A[i] dfs(A[:], b + 1) dfs(nums, 0) return res
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defpermute(self, nums: List[int]) -> List[List[int]]: n, res = len(nums), [] defdfs(b): if b == n: res.append(nums[:]) return for i inrange(b, n): nums[i], nums[b] = nums[b], nums[i] dfs(b + 1) nums[i], nums[b] = nums[b], nums[i] dfs(0) return res
voiddfs(vector<int> nums, int b){ // 这里nums是深拷贝!! int n = nums.size(); if (b == n) { res.push_back(nums); } for (int i = b; i < n; ++i) { swap(nums[i], nums[b]); // 每次把一个数放到最前边(可以保证剩下的序列还是升序),然后对剩下的序列全排列 dfs(nums, b + 1); } }