46.全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思想
数组[1,2,3]的全排序可以看成
1和数组[2,3]的全排序
2和数组[1,3]的全排序
3和数组[2,1]的全排序
代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
void huishu(vector<int> &numss, vector<vector<int>> &hh,int start,int end) //回溯算法的参数设置是难点
{
if(start == end)
hh.push_back(numss); //把全排列放入数组中
else
{
for (int i = start; i <= end; i++)
{
int temp = numss[i]; //确定全排列的这几个数的第一个元素的值
numss[i] = numss[start];
numss[start] = temp;
huishu(numss, hh, start + 1, end);
int temp1 = numss[i]; //回溯 如 0132 应回溯程 0123 接着继续全排列,即返回到原来的状态
numss[i] = numss[start];
numss[start] = temp1;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> h;
if (nums.size() <= 1)
{
h.push_back(nums);
return h;
}
huishu(nums, h,0,2);
return h;
}
int main()
{
int num[] = { 1,2,3 };
vector<int> numss(num, num + 3);
vector<vector<int>> s = permute(numss);
for (int i = 0; i < s.size(); i++)
{
for (int j = 0; j < s[i].size(); j++)
cout << s[i][j] << " ";
cout << endl;
}
return 0;
}