自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 资源 (1)
  • 收藏
  • 关注

原创 力扣日记4.18-【动态规划篇】416. 分割等和子集

关键在于如何转换为 01背包问题,并使用动态规划解决首先要将原题意转换思路:将数组分割成两个子集,使得两个子集的元素和相等 => 相当于寻找一个子集,其元素和为总和的一半!转换后的原问题:需要从nums的所有元素中,挑选一些元素放到子集中,使得子集中的元素的和为sum/2类比背包问题(有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。nums中的元素相当于物品。

2024-04-18 15:46:12 495

原创 力扣日记4.16~4.17-【动态规划篇】01背包问题

二维数组解决更容易理解遍历顺序可以先遍历物品再遍历背包或反之,且两者均为正序遍历(从小到大遍历)一维数组解决需要在二维数组的基础上,理解 利用滚动数组降维 的思想(把上一层的值拷贝的下一层,使得dp[i][j]中的i的维度消去,变为dp[j])—— 还是不太理解。。。同时一维数组在遍历顺序上更有考究,需注意:对背包容量进行遍历时一定要从大到小进行遍历即倒序遍历(防止同一个物品多次放入背包)

2024-04-18 10:40:39 644

原创 力扣日记4.10-【动态规划篇】343. 整数拆分

思路:求一个数拆分之后能得到的最大乘积:则可以尝试把该数拆成2个数、3个数、…等,分别看各种情况的值,再取最大值这里运用动规的关键是,怎么用递推关系表示拆分首先定义dp[i] 表示将 i 拆分之后(注意dp包含了拆分的意味) 可以获得的最大乘积则对一个数 i , 其拆分可表示为两种情况:一是拆成两个数,即 j * (i - j)(这里 j 从 1 遍历到 i-2 ,因为 i - j 要 >= 2 才有意义)

2024-04-10 11:54:23 527

原创 力扣日记4.6-【动态规划篇】746. 使用最小花费爬楼梯

关键在于dp数组的定义以及推导递推关系

2024-04-06 10:43:30 351

原创 力扣日记3.21【贪心算法篇】45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。示例 1:示例 2:提示:复杂度时间复杂度:O(n)空间复杂度:O(1)

2024-03-21 11:36:15 458

原创 力扣日记3.19-【贪心算法篇】55. 跳跃游戏

一开始尝试用回溯算法,虽然思路是正确的,但回溯法相当于穷举,结果超出时间范围了参考代码随想录的思路:看最大覆盖范围!注意每次只移动一个长度(关键!!!),并不断更新最大覆盖范围(即最大可到达的下标)这样的话,就可以不管究竟在每个位置要跳几步,只要知道在覆盖范围内的每个位置能到达的最大下标即可(能覆盖到最大下标即成功)。局部最优:获取每个位置当前可到达的最大下标全局最优:遍历覆盖范围内即可到达的全部元素,找到其中最大的可到达下标即为总的最大下标。

2024-03-19 11:02:53 588

原创 力扣日记3.18-【贪心算法篇】122. 买卖股票的最佳时机 II

要不是知道这是贪心算法篇的,我大概是想不到也不敢用贪心算法的(但是第一次做出来了!Veee)局部最优:当前利润为正(即股价上升),则在前一天购入;当前利润为负(股价下降),则在前一天出售全局最优:累积所有股价上升时的“当前利润”,则可得到最大利润。注意:注释中的own本来是用来记录什么时候持有股票的,但发现用不到,就注释掉了)代码随想录的思路(本质上一样):把利润分解为每天为单位的维度局部最优:收集每天的正利润(即是正利润就收集);全局最优:求得最大利润。TODO:动态规划。

2024-03-18 20:40:35 383

原创 力扣日记3.16-【贪心算法篇】53. 最大子数组和

啊啊啊啊贪心算法好难啊,做一道不会一道 T^T,到底怎么想到局部最优啊……关键:不能让“连续和”为负数的时候加上下一个元素,而不是 不让“连续和”加上一个负数。所以要在当前“连续和”为负数的时候,调整最大子序列区间的起始位置为下一个元素(而不是在加上了一个负数的时候,因为只要当前连续和为正数,就对于增大总和是有利的)。思路来源于代码随想录TODO:动态规划。

2024-03-16 12:00:07 596

原创 力扣日记3.14-【贪心算法篇】376. 摆动序列

思路来源于代码随想录还是不太理解,为什么这种方式是所谓贪心算法?局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。将数字数列以数值大小作为高度排列(如上图),可以发现:当出现一次波峰或波谷,摆动子序列的长度可+1而波谷波峰之间的其他数字,不影响摆动子序列的长度所以关键在于寻找波峰()以及波谷(除此之外,还要考虑存在平坡的特殊情况,如对于1,2,2,2,1 可算作含有一个波峰;

2024-03-14 21:55:19 1024

原创 力扣日记3.11-【贪心算法篇】455. 分发饼干

贪心算法:关键是找到什么是局部最优,并如何从局部最优推到全局最优这里的全局最优就是喂饱尽可能多的小孩局部最优的两种思路:一是 小饼干优先给小胃口(如果小饼干不满足当前(小)胃口,则尝试更大饼干)二是 大饼干优先给大胃口(如果大饼干不满足当前(大)胃口,则尝试更小胃口)选择哪一个数组作为for循环遍历可以模拟一下,看在模拟时哪一个数组的元素可能会需要跳过,需要跳过的用for循环(如果for循环的是另一个数组,会卡住)或者通过看“如果不满足当前条件,尝试的是什么。

2024-03-11 22:33:43 991

原创 力扣日记3.8-【回溯算法篇】37. 解数独

本题与之前做的Q皇后,甚至组合、子集等问题,在思路上完全不一致。前面的题目,在递归时是有指明递归方向的(纵向遍历),如Q皇后中,递归参数row + 1指明递归是往下一行遍历,组合、子集问题中递归参数也指明递归是往下一个值遍历。而本题中,进入下一层递归时,并没有指明方向,而是直接给一整个棋盘,至于如何知道当前层递归需要处理的是哪个位置,则通过最开始的两层for循环来找位置。硬要说的话,可能排列问题中,在每次递归时也是直接给一整个集合,然后在下一层递归从头开始遍历(再通过used去重)。

2024-03-09 12:50:01 965 1

原创 力扣日记3.6-【回溯算法篇】51. N 皇后

第一次接触到N皇后,即使知道用回溯法,还是不知道如何下手。代码随想录提供思路。关键思路:将N皇后问题转换为树形结构:依次遍历棋盘的各个位置,横向搜索通过for循环,纵向遍历(进入下一行)通过递归棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度只有当前位置有效,才能放入棋盘(处理节点)并进行递归回溯难点(易错):判断当前位置是否有效首先要明确,对于二维数组,row为第一个索引,col为第二个索引。

2024-03-06 10:30:26 922

原创 力扣日记3.3-【回溯算法篇】332. 重新安排行程

见注释思路来源于代码随想录。

2024-03-03 17:34:43 446 1

转载 备忘:回溯算法的性能分析总结(by代码随想录)

备忘:回溯算法的性能分析总结来源:代码随想录

2024-02-23 22:54:54 32

原创 力扣日记2.22-【回溯算法篇】47. 全排列 II

本题与46. 全排列的区别在于,集合中可能存在重复元素。因此,需要考虑去重,即在46题的基础上,需要在for循环遍历(横向遍历)中,过滤掉相同的元素(但又不能影响到纵向递归时元素的可重复选取)。不同于40.组合总和 II和90.子集 II,全排列在for循环遍历时不能使用startindex,即每次for循环遍历都会从头开始遍历,不能直接在for循环中,用来跳过重复元素,因为这样会使得在纵向递归时也无法选取到重复元素。因此,需要一个只会影响到横向遍历的变量,即代码中在for循环前定义的。

2024-02-23 02:54:02 1048 1

原创 力扣日记2.21-【回溯算法篇】46. 全排列

全排列本质上也是组合问题,其特点是:全:要求需要取到集合所有值才行(到了叶子节点才能放入result)排列:则说明相同值但不同排序得到的组合是不同,这样则要求,在每次for循环时都需要从最前面开始遍历(不需要之前组合和子集问题的startindex),但这样需要考虑避免在纵向递归取到重复的值,即要做到在for循环遍历时,只有未取过的值才进行取值遍历。关键是通过一个used数组(哈希表)记录取过的值,即在for循环每次取值前,判断当前值在used。

2024-02-21 21:11:47 428

原创 力扣日记2.20-【回溯算法篇】491. 非递减子序列

本题首先要明确“递增子序列”的概念子序列问题本质上是子集问题递增子序列(或者说非递减子序列)是可以从原集合中非连续取值的!!!这点是易错点,且单从题目描述或例子中不能得出此结论(但经过测试用例确实如此)以[4,7,6,7]为例子,[4,7,7]或[7,7]也是其子序列(这是不同于只能连续取值的字符串子串的)所以本题在去重时,不能像90.子集 II。

2024-02-20 18:06:52 900

原创 力扣日记1.31-【回溯算法篇】90. 子集 II

本题在78.子集的基础上,添加了重复元素,且要对解集进行去重。去重的思路与40.组合总和 II完全一致。直接用为条件跳过(continue)同一层for循环的重复元素即可(即所谓“树层去重”)记得去重前一定要对原集合进行排序!!!

2024-01-31 12:16:22 407

原创 力扣日记1.30【回溯算法篇】78. 子集

子集问题与组合问题(77.组合)相当类似,区别在于,子集是收集树形结构中树的所有节点的结果。而组合问题、分割问题是收集树形结构中叶子节点的结果。由于是收集树的所有节点,所以不需要终止条件,而是每一次进入递归函数,都把path放入results中。至于递归是如何终止的,则是靠for循环每次递归都令使得循环最终能结束(这里也需要startindex,因为是从一个集合中连续取值)也能放在每次之后,但这时就需要提前把空子集{}放入results中。

2024-01-30 11:42:23 424

原创 力扣日记1.28-【回溯算法篇】93. 复原 IP 地址

本题也是一道切割类型的题目

2024-01-28 20:52:48 981

原创 力扣日记1.27-【回溯算法篇】131. 分割回文串

思路完全参考代码随想录本题实际上算是困难题目难点有以下:将切割问题抽象为组合问题,并转换为树状结构如何模拟那些切割线(如何记录截取子串的始末位置)切割问题中递归如何终止(终止条件)在递归循环中如何截取子串(什么时候该递归,什么时候跳过)如何判断回文将切割问题抽象为组合问题,并转换为树状结构:例如对于字符串abcdef:组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个…。

2024-01-27 12:18:46 1116

原创 力扣日记1.26-【回溯算法篇】40. 组合总和 II

本题关键在于去重最开始仅考虑题目中每个数字在每个组合只能使用 一次,就只是通过对candidates排序以及来满足条件。忽略了candidates存在重复元素,这样会导致解集存在重复的组合。如对示例2,如果不用去重操作,会使得结果包含多个[1,2,2],如图所示:其中蓝色圈出的2即为重复取当前集合的相同值导致的结果集重复(或无效的重复操作)观察可知,如果在每一层for循环的每一次取值,判断获得的值与上一次取的值last_value。

2024-01-26 11:57:03 926

原创 力扣日记1.25-【回溯算法篇】39. 组合总和

最开始的时候,由于看到题目同一个数字可以无限制重复被选取,就直接取消了216. 组合总和 III问题中 使用的startindex,这样每次for循环都从头遍历一遍集合,肯定可以重复取,但运行后看到:发觉这样存在一个问题,就是for循环从头遍历会取到当前元素之前的元素,导致结果集存在重复的组合(如[3,2,3]与[2,3,3]重复,就是因为把3放入path后,下一层递归还从2开始取值),因此要避免选到之前的元素,但又要能重复选取到自身,所以在递归时设置。

2024-01-25 10:45:05 944

原创 力扣日记1.23-【回溯算法篇】17. 电话号码的字母组合

将问题转换为树形结构,并模拟遍历、递归回溯过程很有帮助本题中,for循环每次要遍历的集合为某个数字对应的所有字符(如2对应"abc"),不同于之前的题目,递归不需要在当前集合上进行(即不需要通过递归在“abc"中连续取值,即求的是不同集合之间的组合),因此不需要startindex来记录起始位置至于递归,从当前层进入下一层递归,整个集合需要改变,即从digits的当前数字递归到其下一个数字对应的集合,因此通过一个n2c_map来表示数字到字母的映射,就可以通过index。

2024-01-24 10:19:27 945 1

原创 力扣日记1.22-【回溯算法篇】216. 组合总和 III

思路与77.组合基本一致,只是多了一个“相加之和为n”的判断注意这道题,集合即为[1,2,…,9],即类比77.组合问题的n在本题中固定为9(注意与本题的n区别),即for循环遍历的最大个数为9。从这个集合中找k个值,使其和为n。剪枝可从两处进行,一是遍历剩余集合个数;

2024-01-22 21:16:50 453

原创 力扣日记1.21-【回溯算法篇】77. 组合

回溯算法理论基础回溯算法模板框架:void backtracking(参数) {if (终止条件) {存放结果;return;for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表);// 递归回溯,撤销处理结果每个框即为每层递归的for循环,取值即为处理节点,最下面即为达到组合长度(终止条件)后存放结果回溯法三部曲:递归函数的返回值以及参数:为了简化参数,分别为存放整体结果集和单一组合定义两个全局变量,

2024-01-21 11:42:34 952

原创 力扣日记1.19-【二叉树篇】538. 把二叉搜索树转换为累加树

思路:按照右中左的顺序遍历,节点的值加上当前累积值即为新的节点值,同时将当前累加值更新为新节点值(相当于累积值边遍历边累加)这个思路是我瞅着示例图模拟老半天才得出的结论(悲),对此,代码随想录。

2024-01-19 20:34:13 977

原创 力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

构造二叉树本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。对于二叉搜索树的有序数组,其数组中点即为分割点注意在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组(解法一和解法二)。按照这种方法构造出二叉搜索树,自然而然就是高度平衡二叉树。

2024-01-14 21:56:39 477

原创 力扣日记1.13-【二叉树篇】669. 修剪二叉搜索树

本题相比于前两道的插入和删除,还是复杂了许多,且不同于以往的递归,本题在不符合处理(如这里的删除)条件时需要递归,在符合处理(删除)条件时也要递归!!!

2024-01-13 12:02:08 912

原创 力扣日记1.11-【二叉树篇】450. 删除二叉搜索树中的节点

能解出题来好开心(/(ㄒoㄒ)/~~,虽然过程和代码写的很不简洁,但太难得了(悲注释的过程即为解题思路过程,可以多画点图模拟一下关于找到key后删除当前root节点的思路,分几种情况:如果root左节点为空,直接返回右节点如果root右节点为空,直接返回左节点如果左右节点都不为空首先:考虑 如果root的左节点没有右子节点,可以把右子树直接作为左节点的右子树如果root左节点存在右子节点,则看root的右节点的左子节点,思路同理。

2024-01-11 20:50:20 1019

原创 力扣日记1.10-【二叉树篇】701. 二叉搜索树中的插入操作

最关键的:不考虑题目中提示所说的改变树的结构的插入方式只要遍历二叉搜索树,找到空节点 插入元素就可以了!!!只要遍历二叉搜索树,找到空节点 插入元素就可以了!!!只要遍历二叉搜索树,找到空节点 插入元素就可以了!!!

2024-01-11 20:05:21 977

原创 Windows 安装配置 Anaconda、CUDA、cuDNN、pytorch-cuda全流程

网址:https://repo.anaconda.com/archive/选择第一个下载即可双击exe文件,按安装向导安装即可(除安装路径自己选择外,其余均可按默认选项)安装成功会弹出以下界面。

2024-01-04 16:59:44 1282

原创 力扣日记12.27-【二叉树篇】235. 二叉搜索树的最近公共祖先

考虑二叉搜索树特性二叉搜索树不需要通过后序遍历,利用其“左子树小于根、右子树大于根”的特性,对几种情况进行分析即可:情况1:如果 root本身就是p或q,则root就是公共祖先情况2:如果 p->val < root->val < q->val 或反之,则 root 一定是 p 和 q 的最近公共祖先(root在p和q之间 /\ )如图,从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。

2023-12-27 21:26:29 1031

原创 力扣日记12.24-【二叉树篇】236. 二叉树的最近公共祖先

本题想了想没有思路www直接看的代码随想录的…首先明确祖先的概念:一个节点,是 以该节点为根节点的树上的所有节点的祖先;

2023-12-24 12:17:56 923

原创 力扣日记12.23-【二叉树篇】501. 二叉搜索树中的众数

这次没看代码随想录就能跟其思路基本一致,有点小开心2333(ww对我来说太难得了)对于二叉搜索数,中序遍历的时候是有序的,相当于处理有序数组一样,如何在一次遍历的时候就能找到所有众数呢?关键的有两点:1.如果遍历到当前值,count==maxCount了,就将其当作可能的众数,加入结果集中2.但是一旦发现当前值的count>maxCount,说明当前值才是新的唯一的众数,要清空原先的结果集,再把当前值加入。

2023-12-23 12:40:25 899

原创 力扣日记12.21【二叉树篇】98. 验证二叉搜索树

本题就像是脑筋急转弯,得从二叉搜索树转到这样一个思路:如果一棵树是二叉搜索树,其中序遍历一定是有序的!!!(从小到大)因此,本题有两种方式来验证:方式1:先用中序遍历(左中右)得到遍历数组;再对数组判断是否有序(较简单)方式2:直接在中序遍历的同时判断是否有序(需要在递归中保存上一个值,稍复杂)

2023-12-21 22:01:20 469

原创 力扣日记12.19-【二叉树篇】二叉搜索树中的搜索

要注意二叉搜索树的特性:二叉搜索树是一个有序树若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树因此在递归或者迭代时可以利用其特性,判断搜索方向。

2023-12-19 17:37:35 375

原创 力扣日记12.18-【二叉树篇】合并二叉树

我的思路:写的时候好晕,绕半天本题还是得从父节点的角度去处理子节点(看两个根节点是否有左右节点)这里将 root1 作为合并二叉树,需要处理①root1没有左节点而root2有左节点 或者 root1、root2都有左节点②root1没有右节点而root2有右节点 或者 root1、root2都有右节点 这些情况;对于root1有左(右)节点而root2没有,则不需处理。

2023-12-18 22:36:01 982 1

原创 力扣日记12.13-【二叉树篇】从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树的步骤如果后序数组为空, 则为空节点根据后序数组最后一个值得到中节点值寻找中序数组位置作切割点根据此切割点对中序数组进行切割再根据切割后中序数组左右区间长度对后序数组进行切割将中序数组与后序数组的左子树区间进行递归处理(两个左子树区间数组分别为左子树的中序数组和后序数组)将中序数组与后序数组的右子树区间进行递归处理示意图对于第二种解法,即用下标索引表示子数组(而不是直接构造子数组),要分别确定好左右子树的中序和后序数组的开始、结束下标。

2023-12-13 11:20:23 282 1

原创 力扣日记12.3-【二叉树篇】二叉树的所有路径

本题关键在于 递归+回溯如对于[1,2,3,null,5]这样的二叉树, 首先遍历了1-2-5后, 需要回溯到1-2, 再回溯到1, 再继续遍历1-3因此需要在每次递归后进行回溯(见代码)至于遍历, 由于是从根节点遍历到叶子节点, 因此使用前序遍历(中-左-右)前序遍历以及回溯的过程示意图在精简版代码中,之所以不用主动显式回溯是因为在递归函数的参数传递时,参数为 path + “->”, 而不是先将path = path + "->"再传入path。

2023-12-03 11:12:24 193

微机原理频率计设计-Proteus仿真&C语言汇编混编.zip

微机原理频率计课程设计全套资源 内含: Proteus工程文件 源代码 设计报告等

2022-01-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除