Backtracking

2024-06-20 05:48
文章标签 backtracking

本文主要是介绍Backtracking,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需要注意的点:

  1. 是否需要排序,一般有重复需要排序;
  2. isVisited 可以用来避免重复选择,比如permutation
  3. lastVisited可以用在有重复数字的时候避免结果重复
  4. 不同题目区分点在于,递归中的结束条件,什么时候将tempres 放入res中,如何避免重复,每次选择的范围,选择的起始点。

例题参考如下:
Subsets : https://leetcode.com/problems/subsets/

public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, 0);return list;
}private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){list.add(new ArrayList<>(tempList));for(int i = start; i < nums.length; i++){tempList.add(nums[i]);backtrack(list, tempList, nums, i + 1);tempList.remove(tempList.size() - 1);}
}

Subsets II (contains duplicates) : https://leetcode.com/problems/subsets-ii/

public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, 0);return list;
}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int start){list.add(new ArrayList<>(tempList));for(int i = start; i < nums.length; i++){if(i > start && nums[i] == nums[i-1]) continue; // skip duplicatestempList.add(nums[i]);backtrack(list, tempList, nums, i + 1);tempList.remove(tempList.size() - 1);}
} 

Permutations : https://leetcode.com/problems/permutations/

public List<List<Integer>> permute(int[] nums) {List<List<Integer>> list = new ArrayList<>();// Arrays.sort(nums); // not necessarybacktrack(list, new ArrayList<>(), nums);return list;
}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){if(tempList.size() == nums.length){list.add(new ArrayList<>(tempList));} else{for(int i = 0; i < nums.length; i++){ if(tempList.contains(nums[i])) continue; // element already exists, skiptempList.add(nums[i]);backtrack(list, tempList, nums);tempList.remove(tempList.size() - 1);}}
} 

Permutations II (contains duplicates) : https://leetcode.com/problems/permutations-ii/

public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);return list;
}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, boolean [] used){if(tempList.size() == nums.length){list.add(new ArrayList<>(tempList));} else{for(int i = 0; i < nums.length; i++){if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue;used[i] = true; tempList.add(nums[i]);backtrack(list, tempList, nums, used);used[i] = false; tempList.remove(tempList.size() - 1);}}
}

Combination Sum : https://leetcode.com/problems/combination-sum/

public List<List<Integer>> combinationSum(int[] nums, int target) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, target, 0);return list;
}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){if(remain < 0) return;else if(remain == 0) list.add(new ArrayList<>(tempList));else{ for(int i = start; i < nums.length; i++){tempList.add(nums[i]);backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elementstempList.remove(tempList.size() - 1);}}
}

Combination Sum II (can’t reuse same element) : https://leetcode.com/problems/combination-sum-ii/

public List<List<Integer>> combinationSum2(int[] nums, int target) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);backtrack(list, new ArrayList<>(), nums, target, 0);return list;}private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){if(remain < 0) return;else if(remain == 0) list.add(new ArrayList<>(tempList));else{for(int i = start; i < nums.length; i++){if(i > start && nums[i] == nums[i-1]) continue; // skip duplicatestempList.add(nums[i]);backtrack(list, tempList, nums, remain - nums[i], i + 1);tempList.remove(tempList.size() - 1); }}
} 

这篇关于Backtracking的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077275

相关文章

Backtracking 隐式图搜索 总结

心得: Permutation 就需要visited数组,subset和combination不需要; Choose, explore, unChoose Permutations 思路:用visited来表示是否访问过。for循环每次还是从头开始; class Solution {public List<List<Integer>> permute(int[] nums) {List<Li

Reinforced History Backtracking for Conversational Question Answering论文翻译

公众号 系统之神与我同在 链接如下: http://link.zhihu.com/?target=https%3A//www.aaai.org/AAAI21Papers/AAAI-1260.QiuM.pdf 对话问答的强化历史追溯 摘要 在多轮对话中对上下文历史建模已成为更好地理解问答系统中的用户查询的关键步骤。为了利用语境历史,大多数现有的研究将整个语境视为输入,这将不可避免地面临以下两

LeetCode-Backtracking-401. Binary Watch

问题:https://leetcode.com/problems/binary-watch/?tab=Description A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59). Each

【数据结构与算法】backtracking 回溯法

backtracking也是一种编程思想,使用到了递归。 backtracking要解决的问题大致具有这样的特征,为了得到问题的解,需要进行若干步骤,每一步的抉择都是相同的,每一步都是在上一步的基础上完成的,需要记录之前的轨迹,直到终点情况,不过有可能是正确也有可能是错误。比如最典型的N皇后问题。需要部署N个皇后,每一次部署都有N种可能。 其程序在实现上满足下列特征: (1)每一步的处理,先

回溯算法(Backtracking Algorithm)

回溯算法(Backtracking Algorithm)是一种试探性的解决问题方法,主要用于解决约束满足问题。这类问题通常存在多个可能的解,且解的空间可以被形式化地表示出来。回溯算法通过逐步构造候选解并检验其合法性的方式来探索解空间,当遇到无效解或不符合约束条件的情况时,会撤销(回溯)部分或全部已作出的选择,然后转向其他可能的解路径继续搜索。 回溯算法的核心特点和步骤如下: 定义解空间:确定

Backtracking Regression Forests for Accurate Camera Relocalization

这种方法其实类似 deep learning,只不过是以森林的方式进行train,森林是由一系列的决策树组成。 每个决策树中的每个节点都是待训练的参数: 决策树的目的是: ,即输入是image,depth(如果有的话),2d pixel位置,输出是3d点的位置x y z + 最终的feature。因此决策树可以认为是一个从2d到3d的映射,这样的话就导致 每个场景就需要

Python高级算法——回溯法(Backtracking)

Python中的回溯法(Backtracking):高级算法解析 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常应用于组合问题、排列问题、子集问题等。在本文中,我们将深入讲解Python中的回溯法,包括基本概念、算法思想、具体应用场景,并使用代码示例演示回溯法在实际问题中的应用。 基本概念 1. 回溯法的定义 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。

一种完全覆盖算法-Backtracking Spiral Algorithm (BSA) 回溯螺旋算法

ROS1云课→32愉快大扫除 其实算法是如下论文提及的,如下为机器翻译,推荐看原文。 ieeexplore.ieee.org/document/1570413 Proceedings of the 2005 IEEE 2005年IEEE会议录 International Conference on Robotics and Automation Barcelona, Spain, Apr

【算法】用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)

什么是N-皇后问题? 说到这个N-皇后问题,就不得不先提一下这个历史上著名的8皇后问题啦。 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法? 那么,我们将8皇后问题推广一下,就可以得到我们的N皇后问题了。N皇后问题是一个