回溯算法归纳

回溯算法解题思路

  • 回溯的两种思路
  • 题目描述
  • 按照思路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,一经查实,立即删除!

相关文章

Des与3Des加密解密

/// <summary>/// Des和3Des算法/// </summary>public class Des{/// <summary>/// Des加密/// </summary>/// <param name"pToEncrypt">明文</param>/// <param name"sKey">密钥</param>/// <returns…

Javascript中Date对象的使用

JavaScript 没有一个基本的日期数据类型&#xff0c;所以我们只能显式地创建Date对象。我们创建新的Date对象和创建String对象的方式是一样的&#xff0c;使用关键字new和Date构造函数。下面这行创建了一个包含当前日期和实践的Date对象&#xff1a;var todaysDate new Date()…

数据结构与算法总结(完结)

极客时间算法学习之后开始跟着花花酱刷题。大概从4月份开始的。从今天开始&#xff08;2020-8-24&#xff09;开始做总结&#xff0c;复习一下已经刷过的题目。到目前为止leetcode刷题323道。 2020/8/24 完成题目整理&#xff0c;下一步是将每个题目都加上超链接。这个超链接尽…

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…

laravel框架的数据库链接

刚才配置了数据库链接代码之后发现怎么也连不上&#xff0c;是因为有两个文件 .env和.envexample文件&#xff0c;注意配置参数要在.env文件里面&#xff0c;比如我用mysql的话配置.env里 这么一段&#xff1a; DB_CONNECTIONmysqlDB_HOSTlocalhostDB_PORT8889DB_DATABASEshopD…

2899紫金矿业和1862澳华黄金一直都是我的重仓品种啊

2899紫金矿业和1862澳华黄金一直都是我的重仓品种啊2899紫金矿业和1862澳华黄金一直都是我的重仓品种啊http://cache.tianya.cn/publicforum/content/develop/1/135210.shtml 转载于:https://www.cnblogs.com/cy163/archive/2008/02/17/1071029.html

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…

AlarmManager使用注意事项

在使用AlarmManager实现闹钟需要注意的是&#xff0c;intent和pendingintend的context如果是activity&#xff0c;那么当activity回收之后&#xff0c;context对象则不能被AlarmManager用于发送广播打开service之类等等&#xff0c;即使是applicationContext也只是进程唯一&…

Oracle9i OCM认证实践课考试的一些说明

当我考过Oracle9i的OCP之后&#xff0c;某一天在网上闲转&#xff0c;忽然发现在Oracle公司的这个金牌的认证项目之上又推出了一个新的更高一级的认证&#xff0c;它便是OCM&#xff0c;全称是Oracle Certified Master,我把它译为Oracle认证的大师。在网上这方面的信息很少&…

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…

WinAPI: midiOutGetID - 获取输出设备 ID

//声明: midiOutGetID(hMidiOut: HMIDIOUT; {获取输出设备句柄}lpuDeviceID: PUINT {接受 ID 的变量的指针} ): MMRESULT; {成功返回 0; 可能的错误值见下:}MMSYSERR_INVALHANDLE 5; {设备句柄无效}//举例:转载于:https://www.cnblogs.com/del/archive/2008/02/22/1…

mybatis学习(5):安装 SQL Server installsharewowdir命令值无效的问题

[错误消息] INSTALLSHAREDWOWDIR 命令行值无效。请确保指定的路径有效&#xff0c;并且与 INSTALLSHAREDDIR 路径不同。 INSTALLSHAREDDIR 和 INSTALLSHAREDWOWDIR 参数具有相同的值“D:\soft\sql”。但是&#xff0c;这些参数必须具有不同的值。请为其中一个参数指定不同的值…

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、这里是选择生成项…

解决(?)问题

问题从来都没有真正的解决&#xff0c;所谓的解决问题只不过是在将一个问题转移成另一个问题而已 转载于:https://www.cnblogs.com/shadow-abyss/p/11248042.html

asp.net中获得客户端的IP地址

因为要在项目中取到客户端IP,在网上搜了下相关资料,其中有一篇文章总结的比较详细,这里就把一些我用的上总结一下 方便以后查阅. 通常我们都通过下面的代码获得IP: string ip System.Web.HttpContext.Current.Request.UserHostAddress; 或 string ip System.Web.HttpCon…

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

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