回溯思想简单理解

回溯思想简单理解

问题说明
	给定一个正整数数组nums,为方便理解,假定数组中不存在重复的整数。
列出这些整数的全排列
	如:nums={1,2,3},那么答案为:
	{{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}}
问题解释
	1. 我们可以直接穷举出所有的排列可能,这也是回溯算法的核心思想,但一般回溯
都会通过剪枝来减少不合理的可能值
	2. 用树结构来理解回溯的思想

在这里插入图片描述

解空间树
	1. 我们不难在脑海中构建这样的一颗树结构,事实上,它对于所有回溯问题都适用
我们构建一个已选择路径的数组track[],它表示已选择的三个数字,也就是已选择的路径,
例如:选择了{1,2},表示第一步选择了数字1,第二步选择了数字2,那么最后一次做选择
时,我们把已选择的路径从nums剔除出去,第三步也就只能选择数字3  	
	3. 一套适合回溯问题的模板
void backtrack(){
	if 满足结束条件	(track数组已满)
		存储结果..return
		
	for 选择 in 选择列表	(nums长度)
		做选择(加入路径)
		递归下一层
		撤销选择
}
我们用一个List<List<Integer>>存放所有结果值,LinkedList<Integer>存放路径
获得全排列主要代码
/**
     * 如果已经走过的路径等于nums长度,那么说明走到底了
     * @param nums:全排列的数字
     * @param track:已经走过的路径
     */
    public static void backtrack(int[] nums,LinkedList<Integer> track){
        //如果走到底了
        if(track.size()==nums.length){
            res.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);
            //取消选择,方便从下一层回溯时保持原样
            track.removeLast();

        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值