Leetcode 题解 - 搜索--Backtracking(13):Permutations 全排列

博客围绕LeetCode的全排列问题展开,输入数组无重复项。与组合题不同,本题求全排列,采用递归DFS求解。需用visited数组标记数字是否访问过,DFS递归函数循环从头开始,level记录已拼出的个数,达到数组长度即为全排列。

[LeetCode] Permutations 全排列

 

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

 

这道题是求全排列问题,给的输入数组没有重复项,这跟之前的那道 Combinations 和类似,解法基本相同,但是不同点在于那道不同的数字顺序只算一种,是一道典型的组合题,而此题是求全排列问题,还是用递归DFS来求解。这里我们需要用到一个visited数组来标记某个数字是否访问过,然后在DFS递归函数从的循环应从头开始,而不是从level开始,这是和 Combinations 不同的地方,其余思路大体相同。这里再说下level吧,其本质是记录当前已经拼出的个数,一旦其达到了nums数组的长度,说明此时已经是一个全排列了,因为再加数字的话,就会超出。还有就是,为啥这里的level要从0开始遍历,因为这是求全排列,每个位置都可能放任意一个数字,这样会有个问题,数字有可能被重复使用,由于全排列是不能重复使用数字的,所以我们需要用一个visited数组来标记某个数字是否使用过,代码如下:

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> permutes = new ArrayList<>();
        List<Integer> permuteList = new ArrayList<>();
        boolean[] hasVisited = new boolean[nums.length];
        help(permuteList,permutesm, hasVisited, nums);
        return permutes;
    }
    private void help(List<Integer> permuteList, List<List<Integer>> permutes,
                     boolean[] visited, final int[] nums){
//次数一定是n*n个list 所以每带nums.length就添加N组到我们要返回的list中
//这个思路和下面重复利用visited是一个道理
        if(permuteList.size() == nums.length){
            permutes.add(new ArrayList<>(permuteList));// 一定是这种写法
            return;
        }
//for循环遍历每个数组 这里是visited 毕竟用过的不能再用l
        for(int i=0; i < visited.length; i++){
            if(visited[i])
                continue;
            visited[i] = true;
            permuteList.add(nums[i]);
//继续遍历每个数组 用过的不能再用,
//!!!!当然是仅限单词for循环的子递归函数里面 逐渐逐渐不能用了1 2 3 4 5 6 7 8 9
            help(permuteList, permutes, visited, nums);
            permuteList.remove(permuteList.size() - 1);
            visited[i] = false;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值