当前位置:   article > 正文

leetcode 全排列_示例: 输入: [1,2,3] 输出: 1.给定一个 没有重复 数字的序列,返回其所有可能的全

示例: 输入: [1,2,3] 输出: 1.给定一个 没有重复 数字的序列,返回其所有可能的全

一,题目描述:

给定一个没有重复数字的序列,返回其所有可能的全排列

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

二,解题思路:

 采用不断交换两个位置的方法获得所有的排列,即以某个点为开始点,依次和后面的做交换,因为没有重复项,所以得到的序列都是不同的结果,例如

  1. 1 2 3
  2. /*
  3. * 开始点为第一个数
  4. * 1和2交换 ->2 1 3
  5. * 1和3交换 ->3 2 1
  6. */
  7. 2 1 3
  8. /*
  9. * 从2 1 3递归
  10. * 开始点为第二个数
  11. * 1和3交换 ->2 3 1
  12. */
  13. 3 2 1
  14. /*
  15. * 从3 2 1递归
  16. * 开始点为第二个数
  17. * 2和1交换 ->3 1 2
  18. */
  19. /* 结果 */
  20. 1 2 3
  21. 2 1 3
  22. 2 3 1
  23. 3 1 2
  24. 3 2 1

 但是这种方法少了一种结果,{1 3 2} 。因为序列{1 2 3}的时候是以1为开始点,但是没有对2和3进行交换。解决办法就是当开始点进行交换时,也要和自己交换一次,但是交换的结果不能添加到结果中。但是这样对于第一个序列{1 2 3}就不在结果中,所以需要在交换前手动添加第一个序列。 

三,C++代码:

  1. class Solution {
  2. public:
  3. vector<vector<int>> permute(vector<int>& nums) {
  4. vector<vector<int>> res;
  5. /* 添加最初的序列 */
  6. res.push_back(nums);
  7. get_permutation(nums, 0, res);
  8. return res;
  9. }
  10. private:
  11. void get_permutation(vector<int>& nums, int idx, vector<vector<int>>& res)
  12. {
  13. if(idx >= nums.size())
  14. return;
  15. /* 以idx位置作为开始点,依次和后面的交换 */
  16. for(int i = idx; i < nums.size(); ++i)
  17. {
  18. /* 交换,获取一个排列 */
  19. swap(nums[i], nums[idx]);
  20. /* 如果不是自己和自己交换,就把排列添加到结果中 */
  21. if(i != idx)
  22. res.push_back(nums);
  23. /* 递归调用,以下一个位置作为开始点 */
  24. get_permutation(nums, idx + 1, res);
  25. /* 交换完再换回来,回到开始的状态,然后和下一个交换 */
  26. swap(nums[i], nums[idx]);
  27. }
  28. }
  29. };


--------------------- 
作者:一个程序渣渣的小后院 
来源:CSDN 
原文:https://blog.csdn.net/sinat_35261315/article/details/78406927 
版权声明:本文为博主原创文章,转载请附上博文链接!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/949155?site
推荐阅读
相关标签
  

闽ICP备14008679号