Leetcode: Permutations

柔情只为你懂 2022-08-07 15:53 276阅读 0赞

题目:
Given a collection of numbers, return all possible permutations.

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

思路分析:
思路一:
最容易想到的就是递归了!每次在num中拿出1个数字放在第一个,然后剩下的数字做一个全排列。
C++参考代码:

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int> > permute(vector<int> &num)
  5. {
  6. int size = int(num.size());
  7. vector<vector<int>> result;//num全排列的结果
  8. if (1 == size)
  9. {
  10. result.push_back(num);
  11. return result;
  12. }
  13. vector<int> currentElement;//临时保存当前的num
  14. vector<vector<int>> remainingResult;//num除去一个元素以后剩下元素的全排列结果
  15. vector<int> currentResult;//保存当前num的每个全排列
  16. for (int i = 0; i < size; ++i)
  17. {
  18. currentElement = num;
  19. currentElement.erase(currentElement.begin() + i);//去掉第i个元素(从0开始)
  20. remainingResult = permute(currentElement);//后续元素的全排列
  21. int remainingResultSize = int(remainingResult.size());
  22. for (int j = 0; j < remainingResultSize; ++j)
  23. {
  24. currentResult = remainingResult[j];
  25. currentResult.insert(currentResult.begin(), num[i]);//在开始位置插入num[i]
  26. result.push_back(currentResult);
  27. }
  28. }
  29. return result;
  30. }
  31. };

思路二:
同样使用递归:每次循环交换第一个元素和后面元素的位置,然后第一个元素和后面元素的全排列依次加入结果数组中。比如:

对于数组[1,2,3]

  1. 交换1和1的位置(其实第一次不用交换),生成[2, 3]的全排列[2, 3]和[3, 2],然后把1加上去生成[1, 2, 3]和[1, 3, 2]。交换完以后换回来。
  2. 交换1和2的位置,生成[1, 3]的全排列[1, 3]和[3, 1],然后把2加上去生成[2, 1, 3]和[2, 3, 1]。交换完以后换回来。
  3. 交换1和3的位置,生成[2, 1]的全排列[2, 1]和[1, 2],然后把3加上去生成[3, 2, 1]和[3, 1, 2]。交换完以后换回来

其实思路一和思路一有相似之处:都是选出一个元素,剩余元素做全排列。不同的是一:循环遍历给定数组进行计算;二通过交换第一个元素和后面元素的位置,结果为第一个元素+后面元素的全排列。
C++参考代码:

  1. class Solution {
  2. private:
  3. vector<vector<int>> result;
  4. int size;
  5. void permuate(vector<int> &num, int index)
  6. {
  7. if (index == size)
  8. {
  9. result.push_back(num);
  10. return;
  11. }
  12. for (int i = index; i < size; ++i)
  13. {
  14. swap(num[index], num[i]);//交换i和index元素
  15. permuate(num, index + 1);//计算除去index元素,后面元素的全排列
  16. swap(num[index], num[i]);//再换回来
  17. }
  18. }
  19. public:
  20. vector<vector<int> > permute(vector<int> &num)
  21. {
  22. size = int(num.size());
  23. permuate(num, 0);
  24. return result;
  25. }
  26. };

思路三:
使用STL提供的next_permutation函数,next_permutation函数能够以字典序列的方式输出排列的结果,详见:next_permutation。不过直接调用库函数貌似没有体现自己的思考与自己的算法!
C++参考代码:

  1. class Solution
  2. {
  3. public:
  4. vector<vector<int> > permute(vector<int> &num)
  5. {
  6. vector<vector<int> > result;
  7. sort(num.begin(), num.end());//给num升序排序
  8. result.push_back(num);
  9. while (next_permutation(num.begin(), num.end()))
  10. {
  11. result.push_back(num);
  12. }
  13. return result;
  14. }
  15. };

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读