Well, have you solved the nextPermutation problem? If so, your code can be used in this problem. The idea is fairly simple:
nums in ascending order, add it to res;nums using nextPermutation(), and add it to res;nums returns to the sorted condition in 1.The code is as follows.
A final note, the following code can be applied to the problem of Permutations II without any modification since the cases of duplicates have already been handled in nextPermutation(). If you want to learn more about nextPermutation(), please visit this solution.
1 bool nextPermutation(vector<int>& nums) { 2 int k = -1; 3 for (int i = nums.size() - 2; i >= 0; i--) { 4 if (nums[i] < nums[i + 1]) { 5 k = i; 6 break; 7 } 8 } 9 if (k == -1) { 10 sort(nums.begin(), nums.end()); 11 return false; 12 } 13 int l = -1; 14 for (int i = nums.size() - 1; i > k; i--) { 15 if (nums[i] > nums[k]) { 16 l = i; 17 break; 18 } 19 } 20 swap(nums[k], nums[l]); 21 reverse(nums.begin() + k + 1, nums.end()); 22 return true; 23 } 24 vector<vector<int>> permute(vector<int>& nums) { 25 vector<vector<int> > res; 26 sort(nums.begin(), nums.end()); 27 res.push_back(nums); 28 while (nextPermutation(nums)) 29 res.push_back(nums); 30 return res; 31 }
原文:http://www.cnblogs.com/jcliBlogger/p/4547987.html