【力扣刷题总结之46.全排列】

目录

相关标签

一、题目要求

二、题解和代码

1.题解

2.实现代码

 


相关标签


一、题目要求

 

二、题解和代码

1.题解

全排列官方视频题解

2.实现代码

代码如下:

class Solution {
    

    public List<List<Integer>> permute(int[] nums) {
        // 使用一个动态数组保存所有可能的全排列
        ArrayList<List<Integer>> res = new ArrayList<>();
        //需要一个表示路径的变量 path,它是一个列表,特别地,path 是一个栈;
        Deque<Integer> path = new ArrayDeque<Integer>();
        //用于判断数组的元素有没有被使用,根据下标判断
        boolean[] used = new boolean[nums.length];
        perdfs(nums,nums.length,0,path,used,res);
        return res;
    }

    /**
     *
     * @param num //要排序的数组
     * @param len//数组长度
     * @param depth//树的层数,当和len一样时说明已经拿到排序
     * @param path//需要一个表示路径的变量  
     * @param used//用于判断数组的元素有没有被使用
     * @param res//返回结果
     */
    public void perdfs(int[] num ,int len,int depth,Deque<Integer> path,boolean[] used,List<List<Integer>> res){
        // 递归终止条件是:path 的长度等于 len
        if (depth == len){ //说明到了层数
            res.add(new ArrayList<>(path));
            return;
        }
        // 遍历可能的搜索起点
        for (int i = 0; i <len ; i++) {
            if (used[i]){//当成立,说明这个元素被存进了path,已经使用过了,跳过元素
                continue;
            }
            // 向路径变量里添加一个数到末尾
            path.addLast(num[i]);
            used[i] =true;//把下标置为ture 表示已存储
            // 下一轮搜索,设置的depth要加 1(表示进入下一层),因为组合数理不允许出现重复的元素
            perdfs(num, len, depth+1, path,used, res);
            //需要回溯,就是要把添加在末尾的弹出
            path.removeLast();
            //然后把该下标置为false ,表示已经弹出,可以给下一次使用
            used[i] = false;
        }
    }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值