自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《数据结构(c语言版)》笔记 |02.线性表

2.1.1.定义。

2024-07-08 20:57:05 1589

原创 Day50:代码随想录算法训练营第50天| 123.买卖股票的最佳时机III

dp[i][j]中表示第i天,j为[1 - 5]五个状态,dp[i][j]表示第i天状态为j所剩的最大现金。一、第i天买入股票了,dp[i][1] = dp[i -1][0] - prices[i](注:这里所说的例如dp[i][1]表示的是并非是一定是在第一天去买股票。第0天进行了第一次操作, dp[0][1] = -prices[0];二、第i没有操作,dp[i ][1] = dp[i -1][1]第0天没有进行任何操作那么dp[0][0] = 0。在上述当dp[i][1]出现时。

2023-10-05 20:39:30 174

原创 Day49:代码随想录算法训练营第49天|

dp[i][0]:表示第i天持有的股票所得最多现金,由于本题只能买卖一次,那么其实一开始现金就是0,那么加入第i天的现金就是-prices[i],这是一个负数。有递推公式可得dp[0][0]和dp[0][1]都要考虑,那么dp[0][0]表示第0天持有股票,那么就是dp[0][0] -= prices[0];所以最后要选择两者现金最大数:dp[i][0] = max(dp[i -1], -prices[i]);dp[0][1]表示第0天不持有股票,不持有股票那么现金为0,所以dp[0][1] = 0;

2023-10-05 19:49:49 150

原创 Day48:代码随想录训练营第48天:打家劫舍系列

本题使用动态规划,但与之前的题目还是有所不同,这是一种关于树的遍历,那么既然涉及到树的相关知识,就一定要考虑其中一种遍历方式(前中后遍历或是层次遍历)那么 这题是一种后序遍历,根据递推公式来推导,所以接下来是以递归三部曲为框架,然后结合动态规划五部曲来写。1.在偷的时候要明白不能偷相邻的房间,所以是dp[i - 2],这是偷第i个以及前i个房间的钱币及dp[i - 2]+nums[i]。但第一种情况是包含在后两种情况里的,所以最终还是只考虑后两种情况,因为这是考虑,并非一定要去偷最后的尾元素或者首元素。

2023-09-24 19:50:13 139

原创 Day46:代码随想录训练营第46天|139.单词拆分

dp[i]状态是依靠dp[j]是否为true,如果dp[0]表示字符串为空那么就是有空字符串,但题目说的条件是非空,所以排除这种情况。字符串的顺序并不能颠倒,讲究要有一定顺序,所以一定是求排列数即先遍历背包顺序,然后在遍历物品顺序。dp[i]:字符串长度为i,dp[i]为true,即可以拆分为一个或多个在字典中出现的单词。当dp[j]为true,那么在往后推导都会成立,所以dp[i]一定就是true。题目中说可以拆分一个或多个在字典出现的单词,是一个完全背包。5.打印dp数组验证递推公式正确。

2023-09-16 20:35:38 103

原创 Day45:代码随想录算法训练营第45天|70.爬楼梯

由于本题是要求组合数的情况,并不在乎顺序问题,故两种遍历顺序都可,先遍历钱币再遍历总金额 ,这种得到是组合数,如5有一种组合是1+2+2,这种只算一种情况,但先便利总金额再遍历钱币,得到则是排列数,组合只能有一种,但满足该组合的排列顺序不止一种,第一种可以快速得出答案,第二种等于是将总金额多次计算从而得出多出排列情况。凑足总额j - coins[i],i为硬币面额,dp[ j - coins[i]]就是为了凑够总额所要的最少个数,那么在凑够总额的最后加上coins[i]当i = 0时,dp[0] = 0,

2023-09-15 22:55:36 43

原创 Day44:代码随想录算法训练营第44天| 518.零钱兑换

dp[0] = 0是错误的,如果dp[0] =0则后面都是0,所以dp[0] = 1,其实dp[0] =1本身是没有什么意义,dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。dp[j]是所有dp[j- coins[i]]的总和,所以递推公式是dp[j] += dp[j - coins[i]]dp[i] :组成目标正整数i的排列个数为dp[i]5.举例推导dp数组。

2023-09-06 16:12:50 66

原创 Day43:代码随想录训练营第43天| 1049.最后一块石头的重量II

接下来就是如何初始化dp[j]呢,因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。dp[j]表示容量(其实就是重量)为j的背包,最多可以背最大重量为dp[j]当然也可以把石头遍历一遍,计算出石头总重量 然后除2,得到dp数组的大小。如果使用一维数组,物体遍历for循环在外层,遍历背包for循环在内层。

2023-09-01 13:06:33 47 1

原创 Day41:代码随想录训练营第41天| 343.整数拆分

首先看递推公式dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j}),所以要从前向后遍历。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});一个是j * dp[i - j],相当于是拆分(i - j),对这个拆分不理解的话,可以回想dp数组的定义。dp[0],dp[1]均没有意义,可以初始化为0,反正最后要的是最大乘积,dp[2]=1。dp[i]:分拆数字i,可以得到最大乘积为dp[i]

2023-08-25 10:22:56 160 1

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

此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i,j]代表从(0,0)出发,到(i,j)有dp[i][j]条不同路径。dp[i - 1][j] 和 dp[i][j - 1]。

2023-08-24 10:52:11 166 1

原创 Day38:代码随想录算法训练营第38天| 509.斐波那契数 | 70.爬楼梯

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!所以dp[i] = dp[i - 1] + dp[i - 2]从递推公式dp[i] = dp[i - 1] + dp[i - 2];dp[i]:爬到第i层楼梯,有dp[i]种方法。从递推公式中可以看出是从前向后遍历的。

2023-08-23 09:42:06 87

原创 Day31:代码随想录训练营第31天| 455.分发饼干

为了满足更多的小孩,不能浪费,所以可以大尺寸来满足胃口大的,局部最优解是大饼干喂给胃口大的孩子,全局最优解是喂饱尽可能多的小孩。

2023-08-11 11:02:41 72 1

原创 Day28:代码随想录训练营第28天| 93.复原IP地址

pointNum表示逗号数量,当pointNum为3分为4段。需要startIndex,pointNum,记录逗号的数量。题解:本题使用回溯法,依旧是递归三部曲。(1):递归函数参数。

2023-08-10 09:39:34 43 1

原创 Day29:代码随想录算法训练营第27天| 491.递增子序列

题解:本题依旧使用回溯法,回溯法三部曲。本题使用回溯法,递归三部曲。(1):递归函数参数。(3):单层搜索逻辑。(1):递归函数参数。(3):单层搜索逻辑。

2023-08-09 13:20:44 52

原创 Day27:代码随想录算法训练营第27天| 39.组合总和 |40.组合总和II

定义两个全局变量,二维数组存放结果集,数组path存放符合条件的结果,题中给出的参数为candidates和target。参数大致与39题中差不多,但还需要加上bool型数组used,用途是记录同一树枝上的元素是否使用过。单层for循环从startlndex开始,搜索candidates集合。题解:和上题一样使用回溯法,回溯三部曲,但这题有一点非常重要:去重。本题使用回溯法,回溯三部曲。(3):单层搜索逻辑。(1):递归函数参数。(2):递归终止条件。(2):递归终止条件。(3):单层搜索逻辑。

2023-08-07 17:11:29 138

原创 Day23:代码随想录算法训练营第23天| 108.将有序数组转换为二叉搜索树

当left > right 的时候就是空节点。本题依旧是使用了递归法,递归三部曲。(1):确定递归函数返回值以及参数。(3):确定单层递归的逻辑。(2):确定递归终止条件。

2023-08-03 09:56:30 44

原创 Day20:代码随想录算法训练营第20天| 654.最大二叉树 617.合并二叉树

因为题目输入数组大小是大于等于1,所以如果当传入的数组大小为1,说明就已经遍历到了叶子节点。1.先要找到数组最大值和对应的下标,最大的值构造根节点,下标用来下一步分割数组。2.最大值所在的下标左区间 构造左子树。3.最大值所在的下标右区间 构造右子树。本题依旧使用递归法,依旧是递归三部曲。1.确定递归函数的参数和返回值。3.确定单层递归逻辑。

2023-08-02 09:19:40 61 1

原创 Day18:代码随想录算法训练营第18天| 513.找树最下角的值 |112.路经总和

不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值,如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。本体还是使用递归法,但使用递归并不是一直向左遍历,应该是先到最后一行然后是最左边的值,其实就是深度最大的叶子节点。(3): 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(2):如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。

2023-07-31 12:23:56 73 1

原创 Day17:代码随想录算法训练营第17天| 110.平衡二叉树 | 257.二叉树的所有路径

3.明确单层递归逻辑,分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。1.确定递归参数以及返回值,要传入根节点,记录每一条路径的path和存放结果集的result,这里递归不需要返回值。本题依旧可以使用递归来求解,但在递归的同时还要使用回溯法,具体过程如下图所示。257.二叉树的所有路径。1. 确定参数和返回值。2.确定递归终止条件。3.确定单层递归逻辑。

2023-07-28 09:08:01 40 1

原创 Day16:代码随想录训练营第16天 | 104.二叉树的最大深度

这里有个坑,正确逻辑理解为如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。3.确定单层递归的逻辑:先求左子树,再求右子树的深度,最后取左右深度最大值+1(因为+1是把中间节点也算进去)就是节点位根节点的树的深度。首先最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点:左右孩子都为空的节点才是叶子节点!2.确定终止条件:如果空节点,那么返回0,表示高度也为0。111.二叉树的最小深度。1.确定参数和返回值。

2023-07-27 09:47:46 35 1

原创 Day15:代码随想录训练营第15天| 二叉树II——层序遍历

层序遍历一个二叉树,就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历。前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。3.确定单层递归的逻辑。当前节点为空,就返回。

2023-07-26 10:19:48 46 1

原创 Day10:代码随想录算法训练营第十天| 232.用栈实现队列 | 225. 用队列实现栈

首先要了解队列和栈的顺序,队列是先进先出,栈是先进后出,那么使用栈来实现队列的行为,所以要使用两个栈,一个是输出栈,一个是输入栈。225. 用队列实现栈。232.用栈实现队列。232.用栈实现队列。

2023-07-21 12:23:10 88 1

原创 Day8:代码随想录算法训练营第八天|344. 反转字符串| 541.反转字符串II| 剑指Offer 05.替换空格

本题运用双指针法进行求解,设置开头一个指针和最后一个指针,然后前后向中间靠拢,最后进行交换即可。本题运用双指针法,首先扩充数组到每个空格替换成%20之后的大小,然后从后向前替换空格。i+=(2*k),i每次移动2*k个,然后判断是否需要有反转的区间。剑指Offer 05.替换空格。541.反转字符串II。

2023-07-19 11:38:33 247

原创 Day7:代码随想录算法训练营第七天| 454. 四数相加 II

(2): 双指针法:首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left定义在i+1的位置上,定义下标right在数组结尾的位置上的位置上。题解:首先遍历A,B数组,统计两个数组元素之和,以及出现的次数,放到map中,之后再遍历C,D两个数组,如果在map中找到0-(c+d),就完成了本题。(1):哈希法:可以用两层for循环确定a,b的数值,之后在寻找0-(a+b)是否在出现过,但题目中有一个问题便是题目中说到不可以包含重复的三元组。454. 四数相加 II。

2023-07-18 15:56:41 95 1

原创 Day4:代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点

本题是一个经典的双指针问题,还是运用虚拟头节点的方法,首先设置两个指针fast和slow,要让fast先移动n+1个位置,因为这样才能保证slow可以指向要删除节点的上一个节点。本题最有难度的地方是对于节点之间的相互连接能否理清,容易造成困难具体的交换顺序应该是先设置一个虚拟头节点,然后按照2,1,3依次交换。19.删除链表的倒数第N个节点。24.两两交换链表中的节点。24.两两交换链表中的节点。本题使用虚拟头节点方法。

2023-07-15 14:45:45 369 1

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

本题主要运用到滑动窗口方法,通过不断的调节子序列的起始位置和终止位置,窗口就是数的总和>=s 的长度最小的连续子序列,之后当窗口总和大于s时,就说明此时该缩小窗口长度,这样可以简化运算过程,精髓就是不断调节子序列的起始位置。首先该题说了是个有序数组,所以数组平方的最大值不是在最左边就是在最右边,这种情况就可以考虑双指针法,需要定义两个下标,然后将两者的平方进行比较进行排序。209.长度最小的子数组。

2023-07-13 15:46:15 216 1

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

面对这种一组数想要查找其中数的位置,最容易也是最先能想到的就是二分查找,在二分查找中主要有两种情况,分别为:左闭右闭和左闭右开。但两者的方法是不同的,最主right的最后赋值,在左闭右闭中因为当前nums[middle]一定不是target,所以要赋值middle-1,在左闭右开中右区间是开,而此时要去左区间寻找,所以right此时要赋值middle。暴力法不做过多解释,双指针可以极大简化代码,关于双指针就是有快指针和慢指针,当快指针所找的元素不等于所要求寻找的元素,就会将该元素向前覆盖一位。

2023-07-12 15:44:20 686 2

空空如也

空空如也

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

TA关注的人

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