17.全排列(不重复的数字版+递归回溯)

在这里插入图片描述
思路分析:容易陷入自己的解题思路模式(想自己搞个标志来实现调用情况,可是不知道如何复原,被绕晕了),官方题解的就是妙a,考虑利用二叉树不停地交换位置来实现全排列!!!!
在这里插入图片描述
for循环—回溯:横向遍历;递归:纵向遍历!!!

class Solution {

    public List<List<Integer>> permute(int[] nums) {       
        List<List<Integer>> container=new ArrayList<List<Integer>>();
        List<Integer> onelist=new ArrayList<Integer>();//每次添加的一个数据组列
        for(int n:nums){
            onelist.add(n);//将原始顺序的数组放置列中
        }
        int length=nums.length;
        backtrack(length,onelist,container,0);
        return container;


    }


    //first这个是个只与后面交换de头位置,first与i位置进行交换,注意回溯的时候需要还原位置
    public void backtrack(int length,List<Integer> onelist,List<List<Integer>> container,int first){
        if(first==length){
            container.add(new ArrayList<Integer>(onelist));//深拷贝
            return;//递归结束,不加这句时,在进入for循环判断也会退出(少执行一条判断语句)
        }

        for(int i=first;i<length;i++){
            Collections.swap(onelist,first,i);//交换列表中的指定位置
            backtrack(length,onelist,container,first+1);//递归继续移动要交换的起始指针,纵向递归
            //开始回溯
            Collections.swap(onelist,first,i);//返回原样横向回溯,进行下一次的for循环的i++,此时first和别的元素交换位置
        }

    }
}

在这里插入图片描述

补充知识:Java中res.add(list)和res.add(new ArrayList<Integer>(list))的区别
在这里插入图片描述
res.add(new ArrayList<>(path))和res.add(path)的区别
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值