题目描述
[MEDIUM]
Given a collection of distinct integers, return all possible permutations.
Example 1:
1 2
| Input: [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
|
Example 2:
1 2
| Input: [0,1] Output: [[0,1],[1,0]]
|
Example 3:
1 2
| Input: [1] Output: [[1]]
|
思路
递归回溯 (backtracking)
题目要求输出所有不重复的排列。
我们可以使用 回溯(Backtracking):
用一个数组 path 来保存当前的排列。
用一个布尔数组 used 标记哪些数字已经被使用。
当 path 的长度等于 nums.size() 时,将当前排列加入结果集。
否则,遍历所有数字:
若该数字未被使用,则加入路径;
递归调用;
回溯(撤销选择)。
代码
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
| class Solution { public: vector<vector<int>> re;
void backtrack(vector<int>& nums, vector<int>& path, vector<bool>& used){ if(path.size() == nums.size()){ re.push_back(path); return; }
for(int i = 0; i < nums.size(); i++){ if(used[i]) continue; used[i] = true; path.push_back(nums[i]); backtrack(nums, path, used); path.pop_back(); used[i] = false; } }
vector<vector<int>> permute(vector<int>& nums) { vector<int> path; vector<bool> used(nums.size(), false);
backtrack(nums, path, used); return re; } };
|