LeetCode算法题46:全排列解析

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

示例:

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

这个题突然让我又对递归产生了新的认识,递归可以是不确定层数的嵌套循环。。。所以这个题还是用递归来解,思路还是深度优先搜索,其实想还是很好想的,和之前那个组合总和很像,有些区别就是这个递归的还是所有的数字,但是已经取到的要排除掉,所以这里只好打个标记。
C++源代码:

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> out;
        vector<int> flag(nums.size(), 0);
        permuteDFS(nums, 0, flag, out, res);
        return res;
    }
    void permuteDFS(vector<int>& nums, int layer, vector<int>& flag, vector<int>& out, vector<vector<int>>& res)
    {
        if(layer==nums.size()) res.push_back(out);
        else
        {
            for(int i=0;i<nums.size();i++)
            {
                if(flag[i]==0)
                {
                    flag[i] = 1;
                    out.push_back(nums[i]);
                    permuteDFS(nums, layer+1, flag, out, res);
                    out.pop_back();
                    flag[i] = 0;
                }
            }
        }
    }
};

python3的代码用另一种方法,依旧是递归,只是这里是不断的交换两个数字,如果想不太通的话,可以只想三个数的情况,三个数就是先取第一个数,然后这种情况下先可以交换后面两个数就有了两种情况,然后第一个数和第二个数交换有了一种情况然后在这种情况下第二个数和第三个数交换就可以一共有两种情况,同理第一个数和第三个数交换也可以有两种情况。实际顺序如下:

[[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,2,1],
[3,1,2]]

python3源代码:

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        self.permuteDFS(nums, 0, res)
        return res
    
    def permuteDFS(self, nums, start, res):
        if start>=len(nums): 
            res.append(copy.deepcopy(nums))
            return
        for i in range(start, len(nums)):
            nums[start], nums[i] = nums[i], nums[start]
            self.permuteDFS(nums, start+1, res)
            nums[start], nums[i] = nums[i], nums[start]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值