LeetCode46:全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

采用回溯法,最简单的是回溯的同时用一个数组标记哪些数已经用过,但是这样需要额外的空间。

可以直接把原数组分为两部分,前半部分为已经用过的数,后半部分为还没用的数,这样维护起来更加方便,也节省了空间。

 1 class Solution {
 2 public:
 3     vector<vector<int>> ret;
 4     vector<vector<int>> permute(vector<int>& nums) {
 5         backtrace(nums,0);
 6         return ret;
 7     }
 8 
 9     void backtrace(vector<int>& nums,int next){
10         if(next==nums.size()){
11             ret.push_back(nums);
12             return ;
13         }
14         for(int i=next;i<nums.size();i++){
15             swap(nums[i],nums[next]);
16             backtrace(nums,next+1);
17             swap(nums[i],nums[next]);
18         }
19 
20         return ;
21     }
22 };
原文地址:https://www.cnblogs.com/rookiez/p/13203693.html