领扣刷题46--全排列

题目如下:

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

示例:

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

思路分析:通过上面的实例我们可以发现数组[1,2,3]的全排列就是让1做首位数字,2,3全排列,让2做首位数字,1,3全排列,让3做首位数字1,2全排列,而2,3的全排列又可以按照上面的套路,让2做首位数字,3的全排列,很明显只有一种,让3做首位数字2的全排列,所以这个题目可以通过递归来解决。而为了避免重复,我们需要每进行一次全排列之后复原数组,这样就是状态的回溯,所以回溯法的解决代码如下:

编程语言c++:

class Solution {
public:
    vector<vector<int>>result;
    void swap(vector<int>& nums,int q,int p)//两数交换的函数,用于每一个数字和首位数字交换
    {
        int temp=nums[q];
        nums[q]=nums[p];
        nums[p]=temp;  
    }
    void prem(vector<int>& nums,int q,int p,vector<vector<int>>& result)//核心代码
    {
        if(p==q)//结束条件,只有一个元素了,就得到了这种条件下的全排列
            result.push_back(nums);
        else
        {
            for(int i=q;i<=p;i++)//通过循环交换首位元素
            {
                swap(nums,q,i);
                prem(nums,q+1,p,result);//递归,解决除了首位之后的元素的全排列,直到达成终止条件
                swap(nums,q,i);//恢复状态,既恢复到可以继续探索解的状态。
                
            }
            
        }
        
        
    }
    vector<vector<int>> permute(vector<int>& nums) {
        int q=0,p=nums.size()-1;
        prem(nums,q,p,result);
        return result;
    }
    
};

猜你喜欢

转载自blog.csdn.net/ZNXcsdn/article/details/82985022