回溯法;排列类问题
//回溯法解决排列类问题
#include <iostream>
#include <vector>
using namespace std;
/*
问题描述:给定一个整型数组,其中每一个元素都各不相同,返回这些元素所有排列的可能。
思考:可将问题抽象为树形结构问题,于是可进一步采用回溯法解决;
函数表达。Perms(nums[0...n-1])={取出一个数字}+Perms(nums[{0...n-1-该数字}])
*/
class Solution{
private:
vector<int> res;
vector<bool> used;//空间换时间,判断当前考虑元素是否已经在排列之中
//p中保存有Index个元素的排列;
//从nums中考虑,向排列中添加第index+1个元素,并保存在p中
void generatePermutation(const vector<int>& nums,int index,vector<int> &p){
if(index==nums.size()){//随着递归深入p中元素增多,直到递归出口,获得了一个排列
res.push_back(p);
return ;
}
for(int i=0;i<nums.size();i++){
if(!used[i]){
p.push_back(nums[i]);
used[i]=true;
generatePermutation(nums,index+1,p);
//回溯过程,剔除当前考虑的元素,并标志为未使用
p.pop_back(nums[i]);
used[i]=false;
}
}
return;
}
public:
vector<vector<int>> premute(vector<int> &nums){
res.clear();
if(nums.size()==0){
return res;
}
used=vector<bool>(nums.size(),false);
vector<int> p;
generatePermutation(nums,0,p);
return res;
}
};
int main(){
}