回溯算法概览

7 series FPGAs Transceiver Wizard IP核使用和测试 学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP... 阅读详情

在leetCode 中涉及到回溯的题目中 有以下几个基本题目,

39.组合总和

40. 组合总和 II

46. 全排列

47. 全排列 II

77.组合

78. 子集

90. 子集 II

通过这些题目,我们可以容易的整理出回溯的基本模版

46.全排列

问题是这样的 :给定一个 没有重复数字的序列,返回其所有可能的全排列。

整体的回溯树如下图所示:
Alt

当前在红色节点上,我们选择的列表有1,3。由于2在后面,2将无法选择。那么就便变成了树的遍历

代码如下:

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    public List<List<Integer>> permute(int[] nums) {
        LinkedList<Integer> track = new LinkedList<>();
        backtrack(track,nums);
        return res;
    }

    public void backtrack(LinkedList<Integer> track,int[] nums){
        if(track.size() == nums.length){
            res.add(new ArrayList<>(track));
            return ;
        }
        for (int i=0;i<nums.length;i++){
          	//判断数据
            if(!track.contains(nums[i])){
                track.add(nums[i]);
                backtrack(track,nums);
              	//撤销操作
                track.removeLast();
            }
        }

    }
}

47.全排列2

这里在46的基础上,将参数从不重复元素的数组变成了一个可以包含重复元素的数组,最简单的做法是在46的基础上,将res从arrayList变成Set就可以了

这里有一个小tip:

对于重复的元素,一定要提前进行排序,这就避免了重复元素所处的位置不相邻而引起的相同数据被纳入。

39.组合总和

原题是 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 其中组合中的数字可以无限选用。

那么我们在46的基础上进行修改:

其中退出条件从trace的长度限制变成了总和为0

if(target ==0){
	res.add(new ArrayList<>(list));
	return;
}

别的就没有改动了

改进

我们可以添加限制条件来达到剪枝的目的,从而减少循环次数。

通过将数组进行排序之后,我们可以得出这个结构: 如果总和小于0之后,那么后续的元素就不用进行添加了,直接退出循环就可以了

代码如下

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    public  List<List<Integer>> combinationSum(int[] candidates, int target) {
        LinkedList<Integer> track = new LinkedList<>();
        Arrays.sort(candidates);
        backtrack(candidates,track,target,0);
        return res;
    }

    public  void backtrack(int[] candidates, LinkedList<Integer> list,int target,int i){
        if(target ==0){
            res.add(new ArrayList<>(list));
            return;
        }
        if(target <0){
            return;
        }
        for (;i<candidates.length;i++){
            list.add(candidates[i]);
            backtrack(candidates,list,target-candidates[i],i);
            list.removeLast();
        }
    }
}

40 组合总和2

这一题在39的基础上,添加了一个限制:组合中的元素只能使用一次,也就是说 在每次进入backtrack的方法,每次就将i增加一个,同时将res变成set就可以完成

优化

我们使用Set的方法来解决重复的问题,我们如果需要使用List来解决问题的话,也就是回退的时候,添加一个判断,如果有当前元素与上一个元素相同的话,就跳过

代码

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        LinkedList<Integer> tracks = new LinkedList<>();
        backtrack(tracks,candidates,target,0);
        return res;
    }

    public  void backtrack(LinkedList<Integer> tracks,int[] candidates, int target,int i){
        if(target==0){
            res.add(new ArrayList<>(tracks));
            return;
        }
        if(i>=candidates.length){
            return;
        }

        for (;i<candidates.length;){
            if(target-candidates[i] >=0){
                tracks.add(candidates[i]);
                backtrack(tracks,candidates,target-candidates[i],++i);
                tracks.removeLast();
                while (i>0 && i<candidates.length && candidates[i] == candidates[i-1] ){
                    i++;
                }
            }else {
                break;
            }
        }
    }

}

总结

通过上述几题,已经可以总结出一个回溯算法的框架:

result = []
def backtrack(路径, 选择列表): 
	if 满足结束条件:
		result.add(路径) 
		return
	for 选择 in 选择列表: 
	做选择
	backtrack(路径, 选择列表) 
	撤销选择
Python 爬虫实战:微信搜一搜内容深度爬取(含搜索结果解析与企业级架构设计) 在信息爆炸的时代,微信搜一搜已成为海量信息获取的重要入口。无论是个人知识探索,还是企业舆情监控,掌握微信搜一搜内容的深度爬取能力具有巨大价值。本文将从基础原理到企业级实现,全面解析微信搜一搜爬虫的开发过程。 阅读详情

相关推荐

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4674

List集合

  图片来源于http://blog.csdn.net/u010887744/article/details/50575735  从图看出Collection继承了Iterable,而List集合继承了Collection,所以List集合都可以使用迭代器来遍历集合 List集合,有序,可以重复的集合。 由于 List 接口是继承于 Collection 接口,所以基本的方法如...

jiulanhao的博客 563

【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序

一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。

XavierJ的博客 2697

Java中常用的集合及方法(3)

List-LinkedList中常用方法及示例

Rcain_R的博客 753

C++ 程序稳定运行一段时间后异常中止?vc6 运行库的bug!!!

事件查看器提示:错误应用程序 xxxxxxx.exe,版本 0.0.0.0,错误模块 MSVCRTD.DLL,版本 6.0.9782.0,错误地址 0x00012b40。这是一个通信方面的软件,需要长期运行,在压力测试时,高负荷连续运行一定天数时必定崩溃,而且都是在msvcrtd.dll中崩溃。后来在dump文件中发现调用栈在是MSVCRTD.DLL模块,跟踪代码发现是在void * __cdecl _heap_alloc_dbg(        size_t nSize,        int nBloc

qingflying的专栏 2679

使用 Python 实现无人机避障的人工势场算法

人工势场算法是一种基于力的控制方法,通过将目标位置视为一个吸引力源,而将障碍物视为排斥力源,来引导移动体朝着目标前进,同时避开障碍物。接下来,我们将定义几个类来实现人工势场算法,包括无人机类、障碍物类和势场类。

闲人编程的博客 2585

Remove和RemoveLast用法

3、即便你使用了ArrayList的数据结构,并不代表你在每次在result添加新的List子表,不用重新new一个ArrayList了,因为。刷代码随想录回溯算法的时候,经常会想到为什么temp都是用LinkedList的数据结构?经过实践证明,ArrayList是可行的。为什么我不能用ArrayList呢?

weixin_43582743的博客 733

【Python爬虫】爬取企业专利信息

本来是个美好的周末的,但是周五晚上领导给了一个公司名称的Excel,让把这些公司的专利信息爬取下来。本文记录了爬取企业专利信息的心酸过程。码字不易,喜欢请点赞!!! 一、找寻目标网页 在接到这个任务之后,我的内心是拒绝的。但是又不能不干。因此首先我需要先找到有公司专利信息的地方。在一番查找和问了问朋友之后,我知道中国专利网、国家知识产权网、Incopat、天眼查、企查查这些网站上面都有企业的专利...

Asher117的博客 2万+

Java 中removelinked_Java.util.LinkedList.removeLast()

描述该java.util.LinkedList.removeLast()方法移除并返回此列表的最后一个元素。声明以下是java.util.LinkedList.removeLast()方法的声明public E removeLast()参数NA返回值此方法返回此列表中的最后一个元素异常NoSuchElementException - 如果此列表为空实例以下示例显示了java.util.Linked...

weixin_29476659的博客 518

用 ABAP OAuth 2.0 Client 直连 SAP SuccessFactors:从体系到落地的一条龙实践指南

ABAP SMI允许在后端对外部服务的OData端点进行定义与自定义化配置,并以受信连接的方式暴露给ABAP应用调用。它并不替代OAuth,而是扮演端点与自定义参数的集中化定义者,最终认证依旧由完成。对于需要在ABAP后端发起临时或补充型OData调用的场景,SMI是一个轻量而清晰的集成入口。scope的客户端应用已经完成注册,API DomainCompany ID、证书或密钥都已归档。ABAP的Profile与Client已建立并绑定,OA2C_GRANT可见绿色访问状态。SMI。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 285

XDMA原理学习(1)——DMA技术详解

DMA 技术是Direct Memory Access的缩写,其意思是“存储器直接访问”。它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。DMA是所有现代计算机的重要特色,它允许不同速度的硬件设备进行沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的数据复制到寄存器,然后把它们再次写回到新的地方。在这个时间里,中央处理器就无法执行其它的任务。

apple_53311083的博客 8380

LeetCode中关于图的题目的整理(待更)

岛屿的周长(simple难度) https://leetcode-cn.com/problems/island-perimeter/ 本方法思路和代码来源: 作者:nettee 链接:https://leetcode-cn.com/problems/island-perimeter/solution/tu-jie-jian-ji-er-qiao-miao-de-dfs-fang-fa-java-by/ 来源:力扣(LeetCode) // 基本的 DFS 框架:每次搜索四个相邻方格 vo

代码之美 735

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

算法设计与分析期末复习整理

直接或间接的调用自身的算法。

mwx11301130的博客 597

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c# Leetcode算法分类总结

算法分类 树 总结 栈 总结 回溯算法 哈希算法 字符串 链表 数组 ...

us2019的博客 275

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python算法指南程序员经典,python算法教程pdf百度云

大家好,给大家分享一下你也能看懂的python算法书 pdf,很多人还不知道这一点。9.2.2 算法核心:通过中介点缩短距离217。4.2.5 深度优先遍历与广度优先遍历97。9.3.1 算法核心:迪可斯特朗算法223。9.1.5 算法核心:两个节点集合210。9.3.3 算法核心:选择预估函数226。9.2.1 算法核心:两个矩阵216。9.3.2 算法核心:预估函数224。2.3.5 向单链表中添加元素66。2.3.6 向双链表中添加元素69。4.4 二叉树中的最大路径和102。

nannannanmu的博客 615

常见简单算法-Python实现(1) 知识目录大纲

刚刚结束大学算法课程的学习,记录下来以便之后查阅,所有代码均是自己码并且满足基本的要求

weixin_44332312的博客 262

算法通用设计技术小结

除了数据机构的知识,对于一些通用的算法设计计算我们也要有大致的了解......

充满好奇的threecat 897

膜拜字节大神,一份手写666页大师级算法宝典,竟然轻轻松松干掉LeetCode,amazing!

前言 最近知乎上有个比较火的问题:“如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题?” 其实不管怎么说,算法面试仍是当前最适合公司筛选程序员的方法之一。在字节跳动、华为等公司带动下,无论是求职者还是面试官,都逐渐认识到算法面试其实是相对高效、准确且公平的筛选机制。 可能你会觉得算法面试有几个实际工作中用到的,不过是“面试造火箭,工作拧螺丝”罢了,那我想说你并没有认识到算法面试的真正目的。 说简单点,算法面试就是为了筛选出足够聪明要么足够勤奋的人,在一个算法题中,不仅考

weixin_50666791的博客 389

字节算法中了80%!靠着这份GitHub上的算法小抄,成功斩获Offer

GitHub上的算法小抄又火了!已经有不少人靠它手撕算法题,拿下了字节、腾讯等大厂offer这位大佬在刷题和打ACM比赛中总结出了经验和套路,不问不知道,这份刷题笔记来自FB高级架构师、ACM金牌选手。

公众号:该用户快成仙了 104

leetcode

哈希查找: leetcode1_twosum 双指针: leetcode11_盛最多水的容器 leetcode15_threesum leetcode26_删除排序数组中的重复项 leetcode31_下一个排列 leetcode33_搜索旋转排列数组 分治: leetcode15_threesum 二分法: leetcode33_搜索旋转排列数组 ......

朱晓海的博客 349

LeetCode题目(java)

二叉树 第94题 二叉树的中序遍历

LiuXiaoXueer的博客 421

算法核心代码模版合集

本文系统整理了 17 套算法核心代码模版,涵盖常见算法模式:滑动窗口、nSum 函数、前缀和、差分数组、单调栈与单调队列、二分搜索、二叉树与递归、二叉搜索树、动态规划、DFS 与回溯、BFS、环检测与拓扑排序、二分图判定、并查集、最小生成树(Kruskal)及最短路径(Dijkstra)。每个模版均提供框架伪码、完整 Java 实现及典型应用场景,帮助快速掌握各类算法的解题套路与代码结构,是刷题备考的高效参考手册。

自己在学习过程中的总结 458

【算法设计与分析】3.回溯法—地图填色问题

(1) 回溯法算法设计思想。 (2) 地图填色问题的回溯法解法。

深大cs课程实验及学习笔记,ccfcsp部分真题,华为题库 1万+

代码随想录90——回溯算法1——回溯算法理论基础

🔥本篇概览:数据结构与算法 || 详细讲解了回溯算法の理论基础。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1304

代码随想录91——回溯算法2——组合1

🔥本篇概览:数据结构与算法 || 详细讲解了回溯算法的组合问题。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1036

[LintCode]——目录

Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (2016-02-10) For more problems and solutions, you can see my LintCode repository. I'll keep updating fo...

weixin_30284355的博客 323
上一篇: Spring事务源码阅读(一)
下一篇: 二分查找详解
枫辰215
博客等级 码龄9年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值