题目
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
来源:力扣(LeetCode)
题解
解这道题主要用了通过递归实现回溯的办法。
在处理数组的过程中,先确定当前正在遍历的位,例如第一位,那么就将每一位和第一位互换,然后在下一个递归过程中将第二位和其他数字依次替换,这样的过程和人类的思维几乎一样。
具体可以看这个leetcode 官方题解,讲的还是很具体的,还有动图可以看。
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 { vector<vector<int>> res; public: vector<vector<int>> permute(vector<int>& nums) { if (nums.size() == 0) return res; if (nums.size() == 1) { res.push_back(vector<int>{nums[0]}); return res; }
process(nums, 0); return res; } void process(vector<int> nums, int front) { if (front == nums.size() - 1) { res.push_back(nums); }
for (int i = front; i < nums.size(); i++) { vector<int> _nums = nums; int temp = _nums[front]; _nums[front] = _nums[i]; _nums[i] = temp; process(_nums, front + 1); } } };
|
结果
执行用时 : 16 ms, 在所有 C++ 提交中击败了86.15%的用户
内存消耗 : 10.2 MB, 在所有 C++ 提交中击败了13.65%的用户