首页 > 代码库 > LeetCode46,47 Permutations, Permutations II

LeetCode46,47 Permutations, Permutations II

题目:

LeetCode46 I

Given a collection of distinct numbers, return all possible permutations. (Medium)

For example,
[1,2,3] have the following permutations:

[  [1,2,3],  [1,3,2],  [2,1,3],  [2,3,1],  [3,1,2],  [3,2,1]]

LeetCode47 II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.(Medium)

For example,
[1,1,2] have the following unique permutations:

[  [1,1,2],  [1,2,1],  [2,1,1]]

 分析: 首先先用next_permutation解这两个题。用好STL。

Permutations I:

 1 class Solution { 2 public: 3     vector<vector<int>> permute(vector<int>& nums) { 4         vector<vector<int>> result; 5         int len = nums.size(); 6         sort(nums.begin(), nums.end()); 7         do { 8             result.push_back(nums); 9         } while (next_permutation(nums.begin(),nums.end()));10     11         return result;12     }13 };

Permutations II:

 1 class Solution { 2 public: 3     vector<vector<int>> permuteUnique(vector<int>& nums) { 4         vector<vector<int>> result; 5         int len = nums.size(); 6         sort(nums.begin(), nums.end()); 7         do { 8             result.push_back(nums); 9         } while (next_permutation(nums.begin(),nums.end()));10     11         return result;12     }13 };

当然,用STL写好的函数肯定不是面试的目的,permutation的递归方法也是经典的回溯算法题。

代码:

 1 class Solution { 2 private: 3     vector<vector<int>> result; 4     void helper(vector<int>& nums, int start, int end) { 5         if (start == end) { 6             result.push_back(nums); 7         } 8         for (int i = start; i <= end; ++i) { 9             swap(nums[start], nums[i]);10             helper(nums, start + 1, end);11             swap(nums[start], nums[i]);12         }13     }14 public:15     vector<vector<int>> permute(vector<int>& nums) {16         helper(nums, 0, nums.size() - 1);17         return result;18     }19 };

 

LeetCode46,47 Permutations, Permutations II