回溯算法归纳

回溯算法解题思路

  • 回溯的两种思路
  • 题目描述
  • 按照思路1解决
  • 按思路2解决

回溯的两种思路

看不同的解题方法,形成不同的思维。
先说结论。回溯解题思路1:是对可选择每个元素,采取不选择、选择两种策略,不断递归下去。最近看花花酱的视频,得到思路2:要完成目标分为n个阶段,每个阶段会有不同的选择,在每个阶段尝试不同选择。
下面,以具体leetcode39为例,来说明。

题目描述

输入:一个不包含重复元素的数组candidates,一个int target
输出:用candidates中的元素组成target,输出有多少种组合。输出结果不能重复。
规则:candidates中的元素可以使用多次。
例如candidates=[2,3,6,7] target=7,返回
[
[7],
[2, 2, 3]
]

按照思路1解决

结果集是包含多种解法,用List<List> result 表示。每一种解法是一个List list。
对于候选数组candidates中的每个元素,我们可能使用,也可能不使用。
例如对于index = 0,我们可能使用candidates[0],也可能不使用。
不使用candidates[0],target不变,list不变,index+1,进入选择candidates[1]阶段。
使用candidates[0],target变小,list添加使用candidates[0],index+1,进入选择candidates[1]阶段。注意因为题目说一个元素可以重复使用,那candidates[0]最多可以使用target/candidates[0]次。

在代码中使用path记录每个元素选择多少次。path[0]=candidates[0]选择的次数。
退出条件:当target=0,问题解决,添加结果集。下标超出范围的时候,或者target=0,退出循环。

	private List<List<Integer>> result = new ArrayList<List<Integer>>();private int[] path;private int[] candidates;/*** path[i] = 使用nums[i]元素的次数* @param candidates* @param target* @return*/public List<List<Integer>> combinationSumV2(int[] candidates, int target) {result.clear();path = new int[candidates.length];this.candidates = candidates;dfsV2(0, target);return result;}private void dfsV2(int idx, int target) {if (target == 0) {List<Integer> solution = new ArrayList<Integer>();for (int i = 0; i < path.length; i++) {for (int j = 1; j <= path[i]; j++) {solution.add(candidates[i]);}}result.add(solution);return;}if (idx >= candidates.length || target < 0) {return;}int maxCount = target / candidates[idx];for (int i = 0; i <= maxCount; i++) {path[idx] = i;dfsV2( idx + 1, target - i * candidates[idx]);path[idx] = 0;}}

按思路2解决

target=7,可以选择2,3,6,7任意一个元素,也就是candidates中下标从0到4的任意一个元素。选择2,list添加2,进入状态target=5。
target=5,可以选择2,3。因为6,7大于5,不用选择剪枝。选择2,list添加2,进入target=3。
target=3,可以选择2,3。因为6,7大于3,不用选择剪枝。选择2,list添加2,进入target=1。

退出条件:当target=0,问题解决,添加结果集。

按照这个思路画递归树,发现有重复的解。可以通过限制下标起点解决。例如图中选择3之后,可以选择的元素就在3,6,7之间,因为3,6,7都大于2,所以就不用继续递归了。所以递归树上的状态需要加上起始下标。修改递归树。

	public List<List<Integer>> combinationSumV3(int[] candidates, int target) {result.clear();Arrays.sort(candidates);this.candidates = candidates;if(candidates==null || candidates.length==0) return result;dfsV3(0,target,new ArrayList<Integer>());return result;}/*** 在当前状态下,可以选择从start到数组结尾的任意一个元素到结果集** @param start* @param target* @param list*/private void dfsV3(int start, int target,ArrayList<Integer> list) {if(target == 0) {//注意结果需要完全拷贝result.add(new ArrayList<Integer>(list));return;}if(start>= candidates.length) return;for(int i = start;i<candidates.length;i++){if(candidates[i] > target) break;list.add(candidates[i]);dfsV3(i,target-candidates[i],list);list.remove(list.size() - 1);}}

每一次dfs是树的一个高度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis学习(1):【持久化框架】Mybatis简介与原理

从这篇博文开始我们学习一下Mybatis&#xff0c;希望大家提出宝贵的建议。 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。iBATIS一词来源于“internet”和“abati…

UML类图解义

小菜&#xff1a;“对了&#xff0c;我时常在一些技术书中看到这些类图表示&#xff0c;简单的还看得懂&#xff0c;有些标记我很容易混淆。要不你给我讲讲吧。” 大鸟&#xff1a;“这个其实多看多用就熟悉了。我给你举一个例子&#xff0c;来看这样一幅图&#xff0c;其中就包…

mybatis学习(2):基本设置和核心配置

1创建一个简单的java项目 2导入jar包 建立一个lib包 链接&#xff1a;https://pan.baidu.com/s/1eJ7xXF2qvUbgde2T--Sphg 提取码&#xff1a;3bgy 加入junit的包 右键项目---build path---add library 4导入配置文件 log4j.properties ### ### log4j.rootLogger ERROR,s…

mybatis学习(3):映射文件的配置和接口创建

配置文件 db.properties jdbc.drivercom.oracle.jdbc.OracleDriver jdbc.urljdbc:oracle:thin:127.0.0.1:1521:wiicare jdbc.usernamewiicare jdbc.passwordMdsd123 log4j.properties ### ### log4j.rootLogger ERROR,stdout### ¡ ### log4j.appender.stdout org.ap…

mybatis学习(4):工具类和实体类的创建

配置文件 db.properties jdbc.drivercom.oracle.jdbc.OracleDriver jdbc.urljdbc:oracle:thin:127.0.0.1:1521:wiicare jdbc.usernamewiicare jdbc.passwordMdsd123 log4j.properties ### ### log4j.rootLogger ERROR,stdout### ¡ ### log4j.appender.stdout org.ap…

windows下解决pip安装出错问题

今天使用pip install xxx突然报错&#xff0c;找了好久全是在linux上的解决方案&#xff0c;好不容易找到一个windows下的解决方案&#xff0c;所以将他记录下来。 解决方案&#xff1a; cmd中敲命令&#xff1a;python -m ensurepip 得到pip的setuptools 然后就可以用&#xf…

检测ID卡的输入或者是其它卡的输入。

由于ID卡或者是其它的一些不同类型的卡&#xff0c;它们只是负责模拟键盘的录入&#xff0c;但是&#xff0c;它们在录入的时候没有一个很好的标识位可以让我们知道当前输入的是客户手工录入的字符串还是ID卡读入的字符串&#xff0c;我相信&#xff0c;很多人在做这样的开发时…

mybatis学习(6):IntelliJ IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行

一、创建 Java 项目&#xff1a; 1、打开 IDEA 软件&#xff0c;点击界面上的 Create New Project 2、出现以下界面&#xff0c;选中 Java&#xff0c;然后选择 JDK&#xff0c;最后点击 Next&#xff0c;进行下一步&#xff08;我的是 jdk1.8&#xff09; 3、这里是选择生成项…

第一百五十期:Java程序员必备:异常的十个关键知识点

总结了Java异常十个关键知识点&#xff0c;面试或者工作中都有用哦&#xff0c;加油。异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在&#xff0c;数组越界&#xff0c;进行除法时&#xff0c;除数为0等都会导致异常。 前言 总结了Java异常十个关键知识点…

学用 TStringGrid [1] - ColCount、RowCount、Cells

本例功能:1、获取 StringGrid 的行数、列数;2、给单元赋值.运行效果图://示例代码: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Grids;typeTForm1 class(TForm)StringGrid1: TStringG…

第一百五十一期:最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?

除了编程语言之外&#xff0c;要想找一份计算机相关的工作&#xff0c;还需要很多其他方面的技能。最近&#xff0c;来自美国求职公司 Indeed 的一份报告显示&#xff1a;在全美工作技能需求中&#xff0c;数据库语言 SQL、编程语言 Java 分列前两位。 除了编程语言之外&#x…

歌谣致学习编程的你们

目录 致学习编程的你们&#xff0c;希望对大家有所帮助&#xff0c;纯属个人学习经验 前言 学习路线 个人网课学习平台 个人推荐两款软件 个人对于参加培训的看法 个人博客写作 同事同学资源 总结 前言 我是歌谣&#xff0c;一个致力于成为一名优秀的技术革新人员。高…

开发者福音!面向Web场景的云开发服务正式开放!

导 语 继支持小程序开发之后&#xff0c;云开发也支持Web使用啦&#xff01;开发者们可以使用云开发提供的云端能力&#xff0c;直接开发网站应用&#xff0c;如PC端网页、公众号中的网页等。由此开发者可以在网站应用中借助云函数实现业务逻辑&#xff0c;通过与云数据库、对象…

PetShop4.0--转载

以下文章转载于http://www.cnblogs.com/dragonlhf/archive/2006/07/30/463110.html petshop是微软推出的企业级程序架构随着asp.net 2.0推出了petshop4.0&#xff0c;正好这几天没有事&#xff0c;研究一下&#xff0c;学习一下2.0的新特性&#xff0c; 它包括…

mybatis学习(7):Windows下安装MySQL详细教程

1、安装包下载。 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击下载之后&#xff0c;可以选择注册Oracle账号&#xff0c;也可以跳过直接下载。 下载完成后&#xff0c;选择一个磁盘内放置并解压。 2 安装教程 &#xff08;1&#xff09;配置环境变量 变量…

[NLP] 相对位置编码(二) Relative Positional Encodings - Transformer-XL

1. Motivation 在Transformer-XL中&#xff0c;由于设计了segments&#xff0c;如果仍采用transformer模型中的绝对位置编码的话&#xff0c;将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于$segment_i$的第k个token&#xff0c;和$segment_j$的第k个token的…

配置文件 web.config 的讨论

可以直接修改&#xff0c;修改后立即生效&#xff0c;无需重新编译&#xff0c;可以把数据连接对象直接加到web.config 中&#xff0c;从而方便修改&#xff0c;如果写在类中的话&#xff0c;修改后需要重新编译1、所有的配置都必须放在<configuration></configuratio…

mybatis学习(8):The server time zone value '???ú±ê×??±??' is unrecognized or represents more

【报错信息】 【百度翻译】 服务器时区值???????无法识别或表示多个时区。如果要利用时区支持&#xff0c;必须配置服务器或JDBC驱动程序&#xff08;通过ServerTimeZone配置属性&#xff09;&#xff0c;以使用更具体的时区值 【解决方法】 数据库连接配置conf.xml(在原…

mybatis学习(9):mybatis连接mysql数据库

首先本地安装一个mysql数据库 修改账号密码 我的是root 123 并用navicate测试连接 数据库为mybatis 表名为users 我们看一下目录结构 直接上代码 user类 package com.edu.hpu.domain;/*** author Administrator*user表所对应的实体类*/ public class User {//实体类的属…

C#创建xml文件

View Code 1 XmlDocument doc new XmlDocument();2 XmlDeclaration dec doc.CreateXmlDeclaration("1.0", "GB2312", null);3 doc.AppendChild(dec);4 //创建一个根节点&#xff08;一级&#xff09;5 …