领扣刷题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;
    }
    
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值