Permutations II

描述

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

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

next_permutation()

直接使用std::next_permutation(),代码与上一题相同。

重新实现next_permutation()

重新实现std::next_permutation(),代码与上一题相同。

递归

递归函数permute()的参数p,是中间结果,它的长度又能标记当前走到了哪一步,用于判断收敛条件。

扩展节点,每次从小到大,选一个没有被用光的元素,直到所有元素被用光。

本题不需要判重,因为状态装换图是一颗有层次的树。

  1. // Permutations II
  2. // 深搜,时间复杂度O(n!),空间复杂度O(n)
  3. class Solution {
  4. public:
  5. vector<vector<int> > permuteUnique(vector<int>& nums) {
  6. sort(nums.begin(), nums.end());
  7. unordered_map<int, int> count_map; // 记录每个元素的出现次数
  8. for (int i : nums) {
  9. if (count_map.find(i) != count_map.end())
  10. count_map[i]++;
  11. else
  12. count_map[i] = 1;
  13. }
  14. // 将map里的pair拷贝到一个vector里
  15. vector<pair<int, int> > counters;
  16. for (auto p : count_map) {
  17. counters.push_back(p);
  18. }
  19. sort(counters.begin(), counters.end());
  20. // 每个元素选择了多少个
  21. unordered_map<int, int> selected;
  22. for (auto p : counters) {
  23. selected[p.first] = 0;
  24. }
  25. vector<vector<int>> result; // 最终结果
  26. vector<int> p; // 中间结果
  27. n = nums.size();
  28. permute(counters, selected, p, result);
  29. return result;
  30. }
  31. private:
  32. size_t n;
  33. typedef vector<pair<int, int> >::const_iterator Iter;
  34. void permute(const vector<pair<int, int> > &counters,
  35. unordered_map<int, int> &selected,
  36. vector<int> &p, vector<vector<int> > &result) {
  37. if (n == p.size()) { // 收敛条件
  38. result.push_back(p);
  39. }
  40. // 扩展状态
  41. for (auto counter : counters) {
  42. if (selected[counter.first] < counter.second) {
  43. p.push_back(counter.first);
  44. selected[counter.first]++;
  45. permute(counters, selected, p, result);
  46. p.pop_back(); // 撤销动作,返回上一层
  47. selected[counter.first]--;
  48. }
  49. }
  50. }
  51. };

相关题目

原文: https://soulmachine.gitbooks.io/algorithm-essentials/content/cpp/brute-force/permutations-ii.html