回溯问题学习总结

回溯问题

三种情况

每种情况都有子集,组合,排列三种题型

无重复元素不可复选

//子集问题
static List<list<integer>> res=new LinkedList<>();
 &#xA0; &#xA0;static LinkedList<integer> track=new LinkedList<>();
 &#xA0; &#xA0;//&#x65E0;&#x91CD;&#x590D;&#x5143;&#x7D20;
 &#xA0; &#xA0;public static List<list<integer>> subsets(int[] nums) {
 &#xA0; &#xA0; &#xA0; &#xA0;back(nums,0);
 &#xA0; &#xA0; &#xA0; &#xA0;return res;
 &#xA0;  }
&#x200B;
 &#xA0; &#xA0;static void back(int[] nums,int start){
 &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0; &#xA0; &#xA0; &#xA0;for (int i=start;i<nums.length;i++){    track.add(nums[i]);  back(nums,i+1);  track.removelast(); } ​ 组合问题 static list<list<integer>> res=new LinkedList<>();
 &#xA0; &#xA0;static LinkedList<integer> track=new LinkedList<>();
 &#xA0; &#xA0;public static List<list<integer>> combine(int n, int k) {
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(n,1,k);
 &#xA0; &#xA0; &#xA0; &#xA0;return res;
 &#xA0;  }
 &#xA0; &#xA0;static void backtrack(int n,int start,int k){
 &#xA0; &#xA0; &#xA0; &#xA0;if(track.size()==k){
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0; &#xA0; &#xA0;  }
 &#xA0; &#xA0; &#xA0; &#xA0;for (int i=start;i<=n;i++){    track.add(i);  backtrack(n,i+1,k);  track.removelast(); } 排列问题 static list<list<integer>> res=new LinkedList<>();
 &#xA0; &#xA0;static LinkedList<integer> track=new LinkedList<>();
 &#xA0; &#xA0;public static List<list<integer>> permute(int[] nums) {
 &#xA0; &#xA0; &#xA0;back(nums,track);
 &#xA0; &#xA0; &#xA0;return res;
 &#xA0;  }
&#x200B;
 &#xA0; &#xA0;static void back(int[] nums,LinkedList<integer> track){
 &#xA0; &#xA0; &#xA0; &#xA0;if(track.size()== nums.length){
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0; &#xA0; &#xA0;  }
 &#xA0; &#xA0; &#xA0; &#xA0;for (int i=0;i<nums.length;i++){    if(track.contains(nums[i])) continue;  track.add(nums[i]);  back(nums,track);  track.removelast(); } }< code></nums.length;i++){></integer></list<integer></integer></=n;i++){></list<integer></integer></nums.length;i++){></list<integer></integer></list<integer>

有重复元素不可复选

//&#x5B50;&#x96C6;&#x95EE;&#x9898;
List<list<integer>> res = new LinkedList<>();
LinkedList<integer> track = new LinkedList<>();
&#x200B;
public List<list<integer>> subsetsWithDup(int[] nums) {
 &#xA0; &#xA0;// &#x5148;&#x6392;&#x5E8F;&#xFF0C;&#x8BA9;&#x76F8;&#x540C;&#x7684;&#x5143;&#x7D20;&#x9760;&#x5728;&#x4E00;&#x8D77;
 &#xA0; &#xA0;Arrays.sort(nums);
 &#xA0; &#xA0;backtrack(nums, 0);
 &#xA0; &#xA0;return res;
}
&#x200B;
void backtrack(int[] nums, int start) {
 &#xA0; &#xA0;// &#x524D;&#x5E8F;&#x4F4D;&#x7F6E;&#xFF0C;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x503C;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x5B50;&#x96C6;
 &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0;
 &#xA0; &#xA0;for (int i = start; i < nums.length; i++) {
 &#xA0; &#xA0; &#xA0; &#xA0;// &#x526A;&#x679D;&#x903B;&#x8F91;&#xFF0C;&#x503C;&#x76F8;&#x540C;&#x7684;&#x76F8;&#x90BB;&#x6811;&#x679D;&#xFF0C;&#x53EA;&#x904D;&#x5386;&#x7B2C;&#x4E00;&#x6761;
 &#xA0; &#xA0; &#xA0; &#xA0;if (i > start && nums[i] == nums[i - 1]) {
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;continue;
 &#xA0; &#xA0; &#xA0;  }
 &#xA0; &#xA0; &#xA0; &#xA0;track.addLast(nums[i]);
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(nums, i + 1);
 &#xA0; &#xA0; &#xA0; &#xA0;track.removeLast();
 &#xA0;  }
}
//&#x7EC4;&#x5408;&#x95EE;&#x9898;
List<list<integer>> res = new LinkedList<>();
&#x200B;
LinkedList<integer> track = new LinkedList<>();
&#x200B;
int trackSum = 0;
&#x200B;
public List<list<integer>> combinationSum2(int[] candidates, int target) {
 &#xA0; &#xA0;if (candidates.length == 0) {
 &#xA0; &#xA0; &#xA0; &#xA0;return res;
 &#xA0;  }
 &#xA0; &#xA0;// &#x5148;&#x6392;&#x5E8F;&#xFF0C;&#x8BA9;&#x76F8;&#x540C;&#x7684;&#x5143;&#x7D20;&#x9760;&#x5728;&#x4E00;&#x8D77;
 &#xA0; &#xA0;Arrays.sort(candidates);
 &#xA0; &#xA0;backtrack(candidates, 0, target);
 &#xA0; &#xA0;return res;
}
&#x200B;
void backtrack(int[] nums, int start, int target) {
 &#xA0; &#xA0; &#xA0; &#xA0;if (trackSum == target) {
 &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
 &#xA0;
 &#xA0; &#xA0;if (trackSum > target) {
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
&#x200B;
 &#xA0;
 &#xA0; &#xA0;for (int i = start; i < nums.length; i++) {
 &#xA0; &#xA0; &#xA0; &#xA0;// &#x526A;&#x679D;&#x903B;&#x8F91;&#xFF0C;&#x503C;&#x76F8;&#x540C;&#x7684;&#x6811;&#x679D;&#xFF0C;&#x53EA;&#x904D;&#x5386;&#x7B2C;&#x4E00;&#x6761;
 &#xA0; &#xA0; &#xA0; &#xA0;if (i > start && nums[i] == nums[i - 1]) {
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;continue;
 &#xA0; &#xA0; &#xA0;  }
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;track.add(nums[i]);
 &#xA0; &#xA0; &#xA0; &#xA0;trackSum += nums[i];
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(nums, i + 1, target);
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;track.removeLast();
 &#xA0; &#xA0; &#xA0; &#xA0;trackSum -= nums[i];
 &#xA0;  }
}
//&#x6392;&#x5217;&#x95EE;&#x9898;
List<list<integer>> res = new LinkedList<>();LinkedList<integer> track = new LinkedList<>();
boolean[] used;
&#x200B;
public List<list<integer>> permuteUnique(int[] nums) {
 &#xA0; &#xA0;// &#x5148;&#x6392;&#x5E8F;&#xFF0C;&#x8BA9;&#x76F8;&#x540C;&#x7684;&#x5143;&#x7D20;&#x9760;&#x5728;&#x4E00;&#x8D77;
 &#xA0; &#xA0;Arrays.sort(nums);
 &#xA0; &#xA0;used = new boolean[nums.length];
 &#xA0; &#xA0;backtrack(nums);
 &#xA0; &#xA0;return res;
}
&#x200B;
void backtrack(int[] nums) {
 &#xA0; &#xA0;if (track.size() == nums.length) {
 &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList(track));
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
&#x200B;
 &#xA0; &#xA0;for (int i = 0; i < nums.length; i++) {
 &#xA0; &#xA0; &#xA0; &#xA0;if (used[i]) {
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;continue;
 &#xA0; &#xA0; &#xA0;  }
 &#xA0; &#xA0; &#xA0; &#xA0;// &#x65B0;&#x6DFB;&#x52A0;&#x7684;&#x526A;&#x679D;&#x903B;&#x8F91;&#xFF0C;&#x56FA;&#x5B9A;&#x76F8;&#x540C;&#x7684;&#x5143;&#x7D20;&#x5728;&#x6392;&#x5217;&#x4E2D;&#x7684;&#x76F8;&#x5BF9;&#x4F4D;&#x7F6E;
 &#xA0; &#xA0; &#xA0; &#xA0;if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;continue;
 &#xA0; &#xA0; &#xA0;  }
 &#xA0; &#xA0; &#xA0; &#xA0;track.add(nums[i]);
 &#xA0; &#xA0; &#xA0; &#xA0;used[i] = true;
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(nums);
 &#xA0; &#xA0; &#xA0; &#xA0;track.removeLast();
 &#xA0; &#xA0; &#xA0; &#xA0;used[i] = false;
 &#xA0;  }
}</list<integer></integer></list<integer></list<integer></integer></list<integer></list<integer></integer></list<integer>

无重复元素可复选

&#x200B;
&#x200B;
//&#x5B50;&#x96C6;&#x95EE;&#x9898;
List<list<integer>> res = new LinkedList<>();
&#x200B;
LinkedList<integer> track = new LinkedList<>();
&#x200B;
int trackSum = 0;
&#x200B;
public List<list<integer>> combinationSum(int[] candidates, int target) {
 &#xA0; &#xA0;if (candidates.length == 0) {
 &#xA0; &#xA0; &#xA0; &#xA0;return res;
 &#xA0;  }
 &#xA0; &#xA0;backtrack(candidates, 0, target);
 &#xA0; &#xA0;return res;
}
&#x200B;
&#x200B;
void backtrack(int[] nums, int start, int target) {
 &#xA0;
 &#xA0; &#xA0;if (trackSum == target) {
 &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList<>(track));
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
 &#xA0;
 &#xA0; &#xA0;if (trackSum > target) {
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
&#x200B;
 &#xA0;
 &#xA0; &#xA0;for (int i = start; i < nums.length; i++) {
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;trackSum += nums[i];
 &#xA0; &#xA0; &#xA0; &#xA0;track.add(nums[i]);
 &#xA0;
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(nums, i, target);
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;trackSum -= nums[i];
 &#xA0; &#xA0; &#xA0; &#xA0;track.removeLast();
 &#xA0;  }
}
&#x200B;
//&#x6392;&#x5217;&#x95EE;&#x9898;
List<list<integer>> res = new LinkedList<>();
LinkedList<integer> track = new LinkedList<>();
&#x200B;
public List<list<integer>> permuteRepeat(int[] nums) {
 &#xA0; &#xA0;backtrack(nums);
 &#xA0; &#xA0;return res;
}
&#x200B;
&#x200B;
void backtrack(int[] nums) {
 &#xA0;
 &#xA0; &#xA0;if (track.size() == nums.length) {
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;res.add(new LinkedList(track));
 &#xA0; &#xA0; &#xA0; &#xA0;return;
 &#xA0;  }
&#x200B;
 &#xA0;
 &#xA0; &#xA0;for (int i = 0; i < nums.length; i++) {
 &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;track.add(nums[i]);
 &#xA0; &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;backtrack(nums);
 &#xA0; &#xA0; &#xA0;
 &#xA0; &#xA0; &#xA0; &#xA0;track.removeLast();
 &#xA0;  }</list<integer></integer></list<integer></list<integer></integer></list<integer>

Original: https://www.cnblogs.com/zz01/p/16616245.html
Author: 山野村夫01
Title: 回溯问题学习总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622138/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据库中异常与隔离级别

    数据库相对于其它存储软件一个核心的特征是它支持事务,所谓事务的ACID就是原子性,一致性,隔离性和持久性。其中原子性,一致性,持久性更多是关注单个事务本身,比如,原子性要求事务中的…

    数据库 2023年6月9日
    078
  • GROUP BY 后获取每一组最新的一条记录

    最近有一种需求,一张订单可能有多个支付单,这就要求我们拿到每一张订单的最新支付单。具体思路如下: [En] Recently, there is a demand that the…

    数据库 2023年5月24日
    071
  • MYSQL–>SQL语法

    注:DDL(Data definition Language)数据库定义(比如说表,数据库)DML(Data Mainpulation Language)数据库 表的增删改查DQL…

    数据库 2023年6月14日
    053
  • 解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

    先说解决方法: 在laravel的app/Providers/AppServiceProvider.php中boot方法内,加入长度限制: 至于为什么是248,那是因为在larav…

    数据库 2023年6月14日
    099
  • 【黄啊码】MySQL入门—4、掌握这些数据筛选技能比你学python还有用-1

    大家好!我是黄啊码,今天没继续select * 了吧,如果还继续,那接下来的课程先别学,回去好好把之前的课程重复复习一遍,学明白了我们再会?废话不多说,学今天的课程之前我们先来说说…

    数据库 2023年6月16日
    077
  • Mysql 手册

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ…

    数据库 2023年5月24日
    0120
  • Markdown学习

    Markdown学习 标题 三级标题 四级标题 字体 hello word hello word hello word hello word 引用 环境更加hi举报 分割线 图片 …

    数据库 2023年6月11日
    0104
  • [spring]spring中java实现类代替注解开发

    9.使用javaconfig实现代替xml配置 The central artifacts in Spring’s new Java-configuration sup…

    数据库 2023年6月16日
    077
  • buuctf 派大星的烦恼

    题目如下 首先找到伤疤并提取出来,发现一共有256个数据,根据题目中的提示答案为32位的字符串,再根据伤疤只有两种状态22和44,联想到每8个伤疤拼成8位二进制,22表示0,44表…

    数据库 2023年6月11日
    0151
  • Java并发编程之CAS

    在Java并发编程的世界里,synchronized 和 Lock 是控制多线程并发环境下对共享资源同步访问的两大手段。其中 Lock 是 JDK 层面的锁机制,是轻量级锁,底层使…

    数据库 2023年6月11日
    074
  • JMeter接口自动化发包与示例

    JMeter接口自动化发包与示例 近期需要完成对于接口的测试,于是了解并简单做了个测试示例,看了看这款江湖上声名远播的强大的软件-Jmeter靠不靠谱。官网:https://jme…

    数据库 2023年6月6日
    063
  • 2010最危险的编程错误(转)

    网络无处不在的今天,安全问题日益严峻,攻击事件层出不穷,应该说,软件系统中代码存在安全漏洞是主要的祸因之一。而这实际上反映了软件开发人员在编程的安全性方面缺乏必要的培训和常识。 由…

    数据库 2023年6月11日
    0100
  • mysql基础语法_曾佳豪

    一、构建数据库、表和数据类型 [En] I. Building databases, tables and data types 1.建库 create database if n…

    数据库 2023年5月24日
    091
  • http状态码总结

    表示临时响应并需要请求者继续执行操作的状态代码。 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101 (切换协议) 请求…

    数据库 2023年6月6日
    067
  • DELL误删raid后恢复方法

    DELL误删raid后恢复方法 一台有RAID1信息的硬盘A,一块误删的硬盘B 1.插入硬盘A和B,启动,再按Ctrl+R键,进入raid管理 发现没有硬盘信息,按F2键 选择Fo…

    数据库 2023年6月9日
    096
  • 多商户商城系统功能拆解22讲-平台端分销商品

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球