【leetcode】 46 Permutations 发表于 2019-01-25 | 分类于 leetcode , 算法 全排列 描述求全排列 样例样例1123456789 copy输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路全排列,回溯,用一个数字,返还一个数字 代码1234567891011121314151617181920212223 copyclass Solution {private: void backtrack(vector<int>& nums, vector<vector<int>>& ans, vector<int>& tmpVec){ if (tmpVec.size()==nums.size()){ ans.push_back(tmpVec); return; } for(auto n: nums){ if (find(tmpVec.begin(), tmpVec.end(), n)==tmpVec.end()){ tmpVec.push_back(n); backtrack(nums, ans, tmpVec); tmpVec.pop_back(); } } }public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> ans; vector<int> tmp; backtrack(nums, ans, tmp); return ans; }}; 利用之前的代码leetcode 31题123456789101112131415161718192021222324252627282930313233343536373839 copyclass Solution {public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(),nums.end()); res.push_back(nums); int i = 0; while(!is_sorted(nums.begin(),nums.end(),std::greater<int>())){ i++; nextPermutation(nums); res.push_back(nums); } cout << "i\t" <<i <<endl; return res; } void nextPermutation(vector<int>& nums) { if(nums.size()<=1) {return;} if(is_sorted(nums.begin(),nums.end(),std::greater<int>())){ reverse(nums.begin(),nums.end()); } else{ rec(nums,1); } } bool rec(vector<int>& nums,int start){ if(is_sorted(nums.begin()+start,nums.end(),std::greater<int>())){ sort(nums.begin()+start,nums.end()); //binary search is faster than o(n) int index = upper_bound(nums.begin()+start,nums.end(),nums[start-1]) - nums.begin(); swap(nums[start-1],nums[index]); return true; } else rec(nums,start+1); return false; }}; 参考原题链接