LeetCode每日一题.01(全排列)

全排列:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]

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

示例 2:

输入:nums = [0,1]

输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]

输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解题思路:

        本题要求一个数组所有可能的排列顺序,可以想到用“回溯法”,回溯即是for循环+递归。

        1.创建List数组存放元素,再创建一个存放List数组的大数组;

        2.for()循环遍历nums所有元素,将遍历到的元素存入数组。

        3.在一个元素存入数组后递归进行下下一次往复操作(例如:将1存入数组后,nums数组中还有2,3,递归后再将2或3存入数组,由此往下,直到该List数组长度与nums数组长度一致时,将该数组存放到大数组中);

        4.返回该大数组

图示:

代码实现:

class Solution {
    //创建局部数组,用来存放List数组
    List<List<Integer>> list=new ArrayList<>();
    public List<List<Integer>> permute(int[] nums) {
        //第一次遍历循环,每个元素都在第一位的情况
        for(int x=0;x<nums.length;x++){
            //创建list数组
            List<Integer> l=new ArrayList<>();
            //数组添加元素
            l.add(nums[x]);
            //进入递归
            dfs(l,nums);
        }
        //返回局部数组
        return list;
    }
    public void dfs(List<Integer> l,int []nums){
        //当数组l长度与数组nums长度相同时,表名数组搭建完成,存入局部数组
        if(l.size()==nums.length){
            list.add(new ArrayList<>(l));
        }
        //若未创建完成则继续for循环创建
        for(int x=0;x<nums.length;x++){
            //若是数组中已经添加过的元素,则跳过
            if(!l.contains(nums[x])){
                l.add(nums[x]);
                //继续进行递归
                dfs(l,nums);
                //数组进行完这组递归返回来后,需要删除它的最后一个元素,否则会发生元素叠加状况,例如出现:1,2,3,3,2,1
                l.remove(l.size()-1);
            }
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aruiiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值