回溯算法(全排列)

本文深入探讨了决策树的基础概念,包括路径、选择列表和结束条件,并通过一个具体的例子——含重复数字的全排列问题,展示了如何使用回溯算法进行求解。在全排列问题中,利用回溯策略配合剪枝操作避免了重复数字的出现,有效地减少了搜索空间。
摘要由CSDN通过智能技术生成

参考链接:点击跳转

关键概念:路径、选择列表、结束条件

  1. 路径:也就是已经做出的选择。

  2. 选择列表:也就是你当前可以做的选择。

  3. 结束条件:也就是到达决策树底层,无法再做选择的条件。

套路:

result = []
public void backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return;

    for 遍历选择列表:
		(可以进行剪枝筛选)
        做选择
        backtrack(路径, 选择列表)
        撤销选择

例子1:含重复数字的全排列

class Solution {
    List<List<Integer>> result = new LinkedList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<Integer> temp = new LinkedList<>();
        permute(nums, 0, temp);
        return result;
    }

    public void permute(int[] nums, int index, List<Integer> temp){
        if(temp.size() == nums.length){//结束条件
            result.add(new LinkedList(temp));
            return;
        }

        Set<Integer> set = new HashSet<>();
        for(int i = index; i < nums.length; i++){//遍历选择列表
            if(set.contains(nums[i])){//进行剪枝,去除同一位置的重复数字
                continue;
            }else{
                set.add(nums[i]);
            }
            swap(nums, i, index);//利用交换遍历所有的选择列表
            temp.add(nums[index]);
            permute(nums, index + 1, temp);
            swap(nums, i, index);
            temp.remove(temp.size() - 1);
        }
    }

    public void swap(int[] nums, int m, int n){
        int temp = nums[m];
        nums[m] = nums[n];
        nums[n] = temp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值