【读书笔记:算法小抄】回溯算法·全排列——Java实现

回溯算法解全排列

package com.company;
import static java.lang.System.out;
import java.util.*;

public class Main {

    static List<List<Integer>> permute(int[] nums, List<List<Integer>> trackList){
        // 回溯法求全排列
        LinkedList<Integer> track = new LinkedList<>();
        backtrack(nums, track, trackList);
        return trackList;
    }

    static void backtrack(int[] nums, LinkedList<Integer> track, List<List<Integer>> trackList){
        if (track.size() == nums.length){
            trackList.add(new LinkedList<>(track));  // 避免添加此前路径的引用,创建一个新的实例,数据复制此前路径数据
            return;  // 结束条件,到了决策树叶子结点,无法再进行决策了
        }

        for (int i = 0; i < nums.length; i++){
            if (track.contains(nums[i]))  // 全排列数字不可重复
                continue;

            track.add(nums[i]);  // 做出选择
            backtrack(nums, track, trackList);  // 继续选择
            track.removeLast();  // 返回至原结点时,撤销先前选择
        }
    }

    public static void main(String[] args) {
        List<List<Integer>> res = new LinkedList<>();  // 路径结果集
        int[] nums = {1, 2, 3};
        res = permute(nums, res);
        for (List<Integer> track: res){
            out.println(track);
        }
    }
}

如果你认为对你有用,关注我的微信公众号支持我一下吧!~

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值