lintcode地址:
http://lintcode.com/zh-cn/problem/permutations/
http://lintcode.com/zh-cn/problem/permutations-ii/
全排列,用了子集树的解法:
class Solution { public: /* * @param nums: A list of integers. * @return: A list of permutations. */ int length; vector<int> num; vector<vector<int>> res; vector<vector<int>> permute(vector<int> &nums) { // write your code here length = nums.size(); for(int i=0;i<length;i++){ num.push_back(0); } backtrack(0,nums); return res; } bool isOk(int t){ for(int i=0;i<=t;i++){ for(int j=i+1;j<=t;j++){ if(num[i] == num[j]) return false; } } return true; } void backtrack(int t,vector<int> &nums){ if(t >= length){ res.push_back(num); return; } for(int i=0;i<length;i++){ num[t] = nums[i]; if(isOk(t)){ backtrack(t+1,nums); } } } };
带重复元素的排列
筛选条件就是在i和t不等的时候,保证在t到i之间对应的排列数里没有和nums[i]重复的元素,就可以交换排列。
class Solution { public: int length; vector<int> num; vector<vector<int>> res; /* * @param : A list of integers * @return: A list of unique permutations */ vector<vector<int>> permuteUnique(vector<int> &nums) { // write your code here length = nums.size(); sort(nums.begin(), nums.end()); backtrack(0,nums); return res; } bool isOk(int i,int t,vector<int> &nums){ if(i>t){ for(int j=t;j<i;j++){ if(nums[j]==nums[i]) return false; } } return true; } void backtrack(int t,vector<int> &nums){ if(t >= length){ res.push_back(nums); return; } for(int i=t;i<length;i++){ if(isOk(i,t,nums)){ swap(nums[i],nums[t]); backtrack(t+1,nums); swap(nums[i],nums[t]); } } } };