- 博客(53)
- 收藏
- 关注
原创 专题六:记忆化搜索(递归优化的秘密武器)
首先我们要先理解递归的解法:也就是右边那个递归展开图,不难发现递归时间复杂度很大O(2^N)我们发现d(3)的展开左边和右边是一样的,此时是不是可以想方法当左边递归下去返回d(3)时把d(3)的结果记住,也就是充当备忘录的身份(这个备忘录可以是一个数组/哈希表等)记住了当右边递归下去时,发现需要用d(3),而备忘录当中又有d(3),就不用在展开,直接用时间复杂度就会减小,这种方法就叫记忆化搜索,(带备忘录的递归)。
2025-05-20 14:49:54
560
原创 专题五:floodfill算法(扫雷游戏精讲)
M表示:未挖出的地雷E表示:未挖出的空白方块什么叫未挖出,就是你没玩的时候,棋盘是什么样的,就是你站在上帝视角看待棋盘B:表示挖出来是空白的,如果是空白的要延伸到有数字的才会停止1~8是如果你周围有地雷,当你挖出来时就显示周围的地雷数X:表示挖出来的地雷,如果挖出来是地雷就用X表示,并且游戏结束看示例:一开始点了左下角,左下角是空白就用B表示,知道遇到数字就停返回:当你点一次,返回棋盘的结果算法原理分析:其实本质就是一道深度搜索的题目。
2025-05-19 23:14:49
92
原创 专题五:floodfill算法(太平洋大西洋水流问题)
整张图,左边深蓝的是太平洋,右边浅蓝的是大西洋,你需要在矩阵中找到一个点,使其可以流向太平洋又可以流向大西洋,并且你每次流的时候只能由高到低,或者相等到相等。
2025-05-19 18:17:07
224
原创 专题五:floodfill算法(图像渲染深度优先遍历解析与实现)
给一个初始坐标(sr,sc)比如示例中的粉色的1,如果周围上下左右都是1,就是连通块(性质相同的地方),把它涂上颜色(2)即可,右下角不算,因为不算对角线的。
2025-05-19 10:45:33
323
原创 专题四:综合练习(最经典的回溯题之N皇后详解)
下过国际象棋的都知道,皇后可以在它所在的行,所在的列,还有所在的斜线进行移动这道题就是给n个皇后,nxn的棋盘,让这n个皇后不能互相吃彼此。
2025-05-18 11:43:08
278
原创 专题二:二叉树的深度搜素(二叉树的所有路径)重点理解回溯算法的”恢复现场“
全局变量的path:需要我们手动恢复现场(需要掌握,因为难题中会用到这种方法)函数头的path:函数自动帮我们完成恢复现场 (难题不易设计函数头)代码编写:回溯的恢复现场在哪???//这一句完之后就回溯了而且你没有改变这一层的path,这一层的path还是原来那个path你传进去的那个path进去之后是下一层的,你回退到这一层根本没有改变函数自动帮我们恢复现场了注意这里不要加&(引用)引用就类似全局变量;
2025-05-13 16:55:53
436
原创 回溯算法:深度优先搜索的终极指南
关于二叉树的遍历:这里讲解后序遍历,左右根,当我们遍历一个结点时,先考虑左子树,右子树,根,遍历左子树时,又把左子树看成根节点,在左右根,依次递归下去。我们在研究主问题时,发现子问题也是相同的,如果设解决主问题需要用到函数f,解决相同的子问题也会用到f,因为他们是相同的问题,此时就会出现。以走迷宫为例:每走到一个拐点,都可以分左右,那我第一个往左走,发现行不通,就回到上一级的这个操作就称之为回溯,然后在由上一级往另一边走。在归并那里,就是一个数组,然后标记一下数组的左边和右边,完成数组的排序。
2025-05-11 11:56:46
963
原创 动态规划之二维费用的背包问题解析
给一个m和一个n,m表示最多有多少个0,n表示最多有多少个1,选出来的子集,记录0和1的个数,在不超过的情况下能选的最大子集,也就是能选多少个元素从这里,如果观察敏锐的话,可以发现这是一个背包问题,就是选一堆东西,不能超过巴拉巴拉但这里是有两个背包,也就是m和n,所以这就叫二维背包问题就是由原来的一个体积限制,到现在的体积和重量限制m和n就是两个限制。
2025-05-10 19:39:14
338
原创 动态规划之背包问题(分割等和子集问题)
给一个正整数的数组,让你分隔成两个相等的数组通过观察,我们可以发现,总和是一定的,也就是sum,把sum分成两部分,每部分都是sun/2转换为01背包问题,每个元素都是0或1,挑出的元素总和是sun/2,剩下的那部分就是sum/2了。
2025-05-10 11:57:20
285
原创 动态规划之背包问题:组合优化中的经典NP挑战
背包问题是一种经典的组合优化的NP问题,在计算机科学、运筹学等领域有着广泛的应用。问题可以简单的描述为:假设有一个容量为C的背包和n个物品,每个物品i都有重量w[i]和价值v[i]。目标是选择一些物品放入背包,使得放入背包的物品总价值最大,同时背包中物品的总重量不能超过背包的容量。这里先简单介绍两种背包问题:1.01背包:也就是你物品的个数是1个,你拿了就剩0个,没拿就剩1个2.完全背包:物品个数无数个,可以拿0/1/2/3/4至无穷多个背包也可以分两种:1.背包不需要装满。2.背包必须装满。
2025-05-09 22:20:52
1730
原创 STL之stack&&queue
1.栈是没有迭代器的,因为栈的特性是先进后出,不能随便访问,所以不支持迭代器2.如何遍历?先判断为不为空,不为就取栈顶的数据,取完之后pop就行3.为什么没有析构函数?因为它底层是别的容器,当stack出了作用域自动销毁时会调底层容器的析构函数1.队列是一种容器适配器,专门用于在FIFO(先进先出)中操作,其中从容器的一段插入元素,另一端提取元素2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,从对头出队列。
2025-05-06 21:30:36
1132
原创 动态规划之子序列问题1
以leetcode300题为例此题最为经典,所有的算法书在讲子序列问题时都以这个为模板题,后面的题可以按照此题的分析方法进行分析。
2025-05-05 17:40:58
380
原创 动态规划之最大子数组(环形数组)
第二种就是你可能前面一部分和后面一部分成环了,你求的是最大,那里面就剩最小。无非就两种情况,一个是你在普通数组的情况下能求最大值,也就是你没有成环。环形数组也就是在普通数组上的变形。
2025-05-04 16:05:43
101
原创 动态规划之路劲问题3
dp[i][j]:表示到达这个位置时的最少的健康点数,如果我们以这个表示我们的状态,就会发现有问题,因为这个ij位置的健康点数不仅仅受下一步(也就是往右和往下)的影响,还受后面很多个路径上的点的影响,比如以例题为例:一开始我们如果初始值为3,走完-2还剩1,那我们走不出-3和-5,如果我们初始值为6,走完-2,-3,3,1,但是到-5时变为0,所以初始值为7才是对的,所以我们ij位置不仅仅是受最近的i j-1和i-1 j位置影响,还受多个位置的值影响。以dp[i][j]为结尾,最少的健康点数。
2025-05-03 17:56:01
424
原创 STL之list容器
1.list的底层是双向链表结构,双向链表中的每个元素在互不相关的独立结点中,在结点中通过指针指向前一个元素和后一个元素2.list是可以在常数范围内在任意位置的插入和删除的序列式容器,并且该容器可以前后双向迭代3.vector的优点:支持随机访问,间接的就支持了排序/二分查找/堆排序等缺点:1.头部和中部的插入效率低,需要挪动数据2.插入数据空间不够需要增容,增容需要开新空间,拷贝数据,释放旧空间list的优点:没有增容代价,且任意位置插入都是0(1);
2025-05-03 12:25:01
1459
原创 STL之vector容器
1.vector是可变大小数组的容器2.像数组一样,采用连续的空间存储,也就意味着可以通过下标去访问,但它的大小可以动态改变3.每次的插入都要开空间吗?开空间就要意味着先开临时空间,然后在拷贝旧的到新的上面,在释放原来的,就时间而言,这是一个相对代价很高的任务;显然这是不行的,vector的分配策略:会分配一些而外的空间以适应可能的增长,例如我们平时说的以1.5或者2倍的方式增容,不同的库选择不同的策略权衡空间的使用和重新分配,以至于在插入一个元素时能在常数时间内插入;
2025-05-02 13:41:05
1289
原创 STL之string容器
c_str():返回c格式的字符串 (在string类中是以size表示有效大小,c风格是以\0表示结束,返回c格式的字符串是在末尾加\0,而string在处理字符串是没有\0结尾表示结束,而是用size)在c语言中,字符串以"\0"结尾的一些字符的集合,并且提供了一系列的str函数,但有时候可能会越界访问,且库函数是与字符串分离的,不太符合OOP的思想,为了方便管理,c++封装了一个类。size():返回字符串的有效长度(一般用这个,length比较早期,size是与其他容器统一)
2025-05-01 12:55:50
1030
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人