自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 代码随想录算法训练营第41天|01背包理论基础(二维)、01背包理论基础(滚动数组,一维)、416. 分割等和子集

且本题只需要一个nums数组,既是背包问题中的价值数组value,也是重量数组weight。所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!每种物品有“取”与“不取”两种状态。可以当作一个组合问题。经典的01背包问题,是求每个容量下的最大“价值”。而本题可看作,求每个容量下的最大承载“重量”。没什么好想法,之前没写过背包问题。,这里的n表示物品数量。

2024-03-14 14:14:50 783 1

原创 代码随想录算法训练营第40天|343. 整数拆分、96.不同的二叉搜索树

思路:for循环上的剪枝,剪枝依据是,要想找到乘积最大的拆分方式,需要让拆出来的所有数字尽可能大小相似。所以,对于太大的 j ,可以直接跳过。其实第一反应是回溯……但感觉每层的集合都会很繁琐。递归公式的说明:求dp[i]可分成两种情况。剩下的,拆成3的和,直到剩下4或者不足3(!,但是这个结论需要数学证明其合理性。此处没有证明,而是直接用了结论。思路:本题也可以用贪心,

2024-03-14 00:23:09 396

原创 代码随想录算法训练营第39天|62.不同路径、63. 不同路径 II

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。注意代码里for循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理。row是行数,column是列数,vector<int>(column)是长度为列数的临时vector变量。

2024-03-13 21:06:50 349

原创 代码随想录算法训练营第38天|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

申请一个长度为(n+1)的vector,用于记录整个dp数组。错误原因:我把编译环境选成C了,然而我写的C++程序。不需要长度为n+1的vector数组,只需要2个变量即可。

2024-03-13 20:24:56 769

原创 代码随想录算法训练营第32天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II

这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。把cover当作for循环的逻辑范围!(cover就是上述的maxIndex)的,那么本题就很容易了!(把利润分解为每天为单位的维度)总结:局部最优可以推出全局最优,找不出反例,试一试贪心!局部最优:收集每天的正利润;全局最优:求得最大利润。不过方法确实想了一会儿)“只收集正利润”就是贪心所贪的地方!

2024-03-11 13:38:15 366 1

原创 代码随想录算法训练营第31天|贪心算法理论基础、455. 分发饼干、376. 摆动序列、53. 最大子数组和

答:不会出现这样的情况。如果前一个元素是正数,而加了这个正数之后sum为负,说明在前一个元素(正数)时sum就已经为负了,于是会重新收集,矛盾。当sum为负数时,就从新收集元素,这难道不怕前一个元素是正数吗?“折线图”思想:可以把求“摆动序列”看成求折线图的转折点。可以用动态规划,但是此处不写,后续博客会再练习到这题。贪心:把小饼干分给小孩子,大饼干分给大孩子。记录一下错误代码(仅记录,这代码是错的!所以“前一个元素是正数”的假设不成立!关于“折线法”需要设定的(边界)条件。大饼干给大胃口,让大胃口先吃。

2024-03-09 20:44:36 748

原创 代码随想录算法训练营第29天|491.递增子序列、46. 全排列、47.全排列 II

用一个used数组记录是否已经在该“树枝”上使用了该元素。在for循环中,如果该元素被用过了则跳过。用unordered_set记录已经访问过的元素值。在for循环中,如果已经访问过了,则跳过。错误代码:第二行,set会在每层循环结束时被释放!,vector的构造函数。正确代码:把set的定义写在for循环之外。,因为它们实际上得到的排列是完全一样的!,不会进行排序,且是没有重复元素的集合。,因为它已经包含了后面的所有情况!对于“记录每层使用过的元素”,可以用。aaa不会写,试了很久发现是错的。

2024-03-09 09:53:37 782

原创 代码随想录算法训练营第27天|93. 复原 IP 地址、78. 子集、90.子集II

有重复元素且集合中可以有重复元素(不需要树枝去重),但又要求不能有重复集合(需要树层去重)。封装成一个完整函数,需要判断时调用即可。(要有封装的思想啊啊啊啊!所以,先写好求组合函数,然后直接在调用时求0~size长度的组合即可。子集问题可以看作:寻找所有可能长度的全部组合!,类似于分割回文串。

2024-03-08 16:30:50 354 1

原创 代码随想录算法训练营第26天|39. 组合总和、40. 组合总和 II、131.分割回文串

时间复杂度: O(n * 2^n),注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此。虽然题目允许重复数字,但是为了不得到重复的组合,还是需要限制每次for循环的startIndex!一开始没有思路,因为不知道怎么”有规律“地分割。之后看了文章里的图,明白了。犯了经典错误,确实达成了一个元素只用一次,但是出现了重复的集合。,已经大于target,则该层循环直接跳过。如果当前的sum加上这层for循环会加上的。空间复杂度: O(target)之后写出来了,通过。关于判断是否回文串:(

2024-03-08 14:42:42 999 1

原创 代码随想录算法训练营第25天|216.组合总和III、17.电话号码的字母组合

直接套用“组合”问题的回溯框架,在找到符合规格的组合后判断它们的和是否符合题目。如果符合则记录,不符合则直接返回。我以为是:给出从2-9的某个范围,然后返回所有可能的数字排列对应的所有可能字母排列。代码中最好考虑这些异常情况,但题目的测试数据中应该没有异常情况的数据,所以我就没有加了。注意:输入1 * #按键等等异常情况(可通过字符转换为数字时,限制ASIIC码的范围)实际上是指,在给定的数字序列中,返回所有可能的字母排列。下面代码中,sum没有被回溯,导致错误。本题和”组合“问题的区别?

2024-03-07 14:56:49 470

原创 代码随想录算法训练营第24天|回溯算法理论基础、77.组合

回溯的本质是,其实就是一种暴力解法回溯法解决的问题都可以抽象为。因为回溯法解决的都是在集合中递归查找子集,。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。回溯法三要素整体框架。

2024-03-06 20:26:40 1141

原创 代码随想录算法训练营第18天|513. 找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

上述代码每次都需要传入vector作为参数,但是实际上我们可以直接。类似于“返回所有的路径”的那题,属于深度问题,应该用前序遍历。层序遍历,记录下每层最左的元素(第一个元素)。看了代码随想录的手算方法,有了思路,最后ac。,然后利用vector本身的构造函数。思路:迭代法:(前序遍历)

2024-03-06 17:01:51 351

原创 代码随想录算法训练营第17天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

所以,用vector存数字比较方便,这样可以一次性弹出数字。

2024-03-06 11:55:05 776

原创 代码随想录算法训练营第16天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

如果单纯只判断左右子树最小的值,那么如果左/右孩子中其中一个为NULL,则该结点不是叶子节点,但是返回给上层的值会是NULL对应的路径的值。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)是一种后序遍历的模式,用左右子树的高度的最大值,加一,作为当前节点的高度。树的最小深度:所有“叶节点“高度的最小值!所以,根节点的高度就是二叉树的最大深度。

2024-03-05 12:29:21 799

原创 代码随想录算法训练营第15天|102.二叉树层序遍历、层序遍历类型题目、226.翻转二叉树、101.对称二叉树

其实方法三和方法四(队列和栈)本质上都是通过可存储的数据结构来暂存待处理的节点,主要是要确定入队列/栈的顺序,对于每层结点,提前统计当前queue中的元素个数size,然后用for循环遍历这size个元素。:(单纯的“优先向右遍历”是不行的,必须要层序遍历!)层序遍历,输出每层的最后一个元素。注:要事先记录下queue的size,因为que.size()在之后的过程中会改变!层序遍历,并用deque来记录每层节点,然后判断deque是否对称。:层序遍历,记录每层的和,和每层节点个数size。

2024-03-03 16:24:14 1017

原创 代码随想录算法训练营第14天|二叉树理论基础、递归遍历、迭代遍历、统一迭代遍历

①如果栈顶元素不为NULL,则右孩子先入栈(NULL则不入栈),然后自己入栈,然后NULL入栈,然后左孩子入栈(NULL则不入栈)。②如果栈顶元素为NULL,则说明下一个元素是需要输出的节点,那么弹出栈顶元素,把它的val加入result容器中。先序遍历是“根左右”,后序遍历是“左右根”。那么可以先按“根右左”遍历,再reverse翻转一下。知道手算方法,但是写成代码有困难。此后栈不为空则一直循环。最简单,因为遍历顺序和处理顺序相同。

2024-03-02 15:45:49 393

原创 代码随想录算法训练营第11天|20. 有效的括号 、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

③每扫描到运算符,先将运算符栈中优先级“高于和等于”它的运算符依次弹出栈(到优先级小于它、或左括号、或栈空,为止),再把当前运算符压入栈。③每扫描到运算符,先将运算符栈中优先级“高于和等于”它的运算符依次弹出栈(到优先级小于它、或左括号、或栈空,为止),每弹出一个运算符,要从数字栈弹出两个运算数,把运算结果压入数字栈。①每当扫描到一个右括号,弹出栈顶元素,看是否是与该右括号匹配的左括号,不是则匹配失败,返回false。②整个字符串扫描完毕,如果栈不空,则说明有未匹配的左括号,匹配失败,返回false。

2024-02-22 22:27:04 985 1

原创 代码随想录算法训练营第10天|栈和队列理论基础、232.用栈实现队列、225.用队列实现栈

/栈空间//栈顶指针。

2024-02-22 12:22:43 314 1

原创 代码随想录算法训练营第8天|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

但是一开始只申请了指针,没有申请空间,于是报错(笑丝)。暴力解法,从后往前遍历字符串,每遍历到一个单词则记录下单词的上下边界,复制到returnStr中,并加上空格。(否则a变的时候b也变了,会在第二条语句处得到0^0=0,最后两个值全为0了!双指针:前指针向后,后指针向前,直到二者相遇,在过程中将两指针指向的元素swap。承接上题,有思路,但是被各种下标绕晕了……在本题中,如果写成:(注意while循环条件带了等于号!如果当前字符是空格,并且下一个字符也是空格,则跳过。思路清晰,前后双指针,成功ac。

2024-02-21 17:30:58 793

原创 代码随想录算法训练营第5天|哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

①什么时候想到用哈希法?当我们遇到了(如果在做面试题目的时候遇到需要也应该第一时间想到哈希法)②哈希表:散列表,hash table,根据关键码的值而直接进行访问的数据结构。③哈希函数:hash function,关键码的值到表中元素的映射关系。④tableSize:哈希表大小;dataSize:实际存放哈希表的数组大小⑤空间换时间。

2024-02-17 23:18:12 362 1

原创 代码随想录算法训练营第4天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II、总结

可以算是“暴力解法”:首先遍历链表,求出链表长度,然后再寻找需要删除的位置,删除节点即可。一开始写成了”快指针先走n步“,导致出现了访问空指针的报错。注意点:快指针比慢指针多走几步?,再遍历,判断指针是否相等。

2024-02-17 22:28:43 369

原创 代码随想录算法训练营第3天|链表理论基础、203.移除链表元素、707.设计链表、206.反转链表

但是实现起来漏了一种情况(当该节点不是val也不是头结点时,直接让p和pre指向后一个节点),导致一开始超出时间限制,因为跳不出循环。之后,用cur表示当前节点,检查cur->next是否等于val。如果相等则删除节点,否则cur向后移动检查后续节点。②一开始想到了头插法,但是犯了一个错误:让节点不断头插回“原链表”,导致循环无法结束,超出时间限制。用一个while循环单独处理头结点,直到头结点不等于val。①删除节点,需要释放(free)节点!注意:返回的是头节点,所以。报错原因:试图访问空指针。

2024-02-17 14:44:58 388 1

原创 代码随想录算法训练营第2天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

报错:

2024-02-16 17:21:56 915 1

原创 代码随想录算法训练营第1天|704. 二分查找、27. 移除元素。

题目链接讲解链接。

2024-02-06 17:53:41 378

空空如也

空空如也

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

TA关注的人

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