自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode:84.柱状图中最大的矩形

尾部加0是因为当原数组是单调递增的,当数组内所有元素全部入栈,栈内元素满足单调递减,结果无法得出,尾部加0可以实现遍历到的元素小于栈顶元素,从而得出结果。当遍历到的元素小于栈顶元素时,栈顶元素是基准元素,遍历到的元素是右边第一个比它小的柱子,和栈顶相邻的栈内元素是左边第一个比它小的柱子。首部加0是因为当原数组是单调递减的,为了确保栈顶元素弹出后栈内依然有元素,在数组首部进行加0;需要选出基准元素,选出左边第一个比它小的柱子,以及右边第一个比它小的柱子。

2024-04-17 15:15:34 367 1

原创 leetcode:42.接雨水

如果当前遍历到的元素大于栈顶元素,则该元素为栈顶元素右边第一个比它大的元素,此时,栈顶元素的栈内相邻元素是该元素左边第一个比它大的元素。【其中栈顶元素是凹槽中间的柱子】需要知道当前遍历到的元素左边和右边第一个比该元素大的元素。

2024-04-16 21:42:10 294

原创 leetcode:503.下一个更大元素2

将496题解中下表为i的地方换成i%len(nums)即可。【只需要在循环的时候长度变成原数组的2倍,不需要真正使得数组叠加,其他地方下标改变即可。这道题目和 496.下一个更大元素 唯一的不同之处是:给出的数组是循环数组,这意味着需要循环地搜索它的下一个更大的数。

2024-04-16 16:46:00 351

原创 leetcode:739.每日温度/496.下一个更大元素

已找到目标元素,弹出栈顶元素,(直到当前遍历到的元素<=栈顶元素)将当前遍历到的元素加入单调栈。【这是一个循环的过程】单调栈里的元素递增,求解当前元素右边比该元素大的第一个元素;元素递减,求解当前元素左边比该元素大的第一个元素。相比于纯粹的单调栈问题,这道题目还增加了两个数组之间的映射这一环节。求解当前元素右边比该元素大的第一个元素(左右、大小都可以)。直接将当前遍历到的元素加入单调栈。2.当前遍历到的元素<=栈顶元素。1.当前遍历到的元素>栈顶元素。单调栈里存储数组的下标;

2024-04-16 11:16:52 396

原创 动态规划:线性dp

由于LIS只能处理单调序列最长,所偶不能直接使用,这里是两头低中间高的情况。可以发现,在这种情况下,最多的话就是最高的人的左边加上其右边。= bj时,求Ai-1和Bj或者Ai和Bj-1的最长公共子序列的长度(选最大的)。dp[i][j]含义:序列Ai(a1-ai)和Bj(b1-bj)的最长公共子序列长度。(1)当ai = bj时,已经求得Ai-1和Bj-1的最长公共子序列。dp[i]含义:在前i位同学中进行挑选,身高能够满足递增的最大人数。通过枚举中间那个人,看其左侧和右侧LIS值之和,方可求解。

2024-04-04 22:05:34 249

原创 3种背包问题总结

1.0-1背包2.完全背包3.多重背包。

2024-03-25 21:53:54 227

原创 HJ103 Redraiment的走法

遍历过程:遍历坐标为i之前的数组h,若h[j] < h[i],那么此时有两种情况,dp[i]要么是dp[j] + 1,要么是dp[i](不变),选二者中最大的。dp[i]数组含义:到达第i个桩的最大步数。dp数组初始化全为1。

2024-03-23 22:01:30 159

原创 lanqiao:修改数组

代码实现:

2024-03-08 21:54:55 129

原创 lanqiao:合根植物

题目描述:

2024-03-07 22:55:30 226

原创 lanqiao:大学里的树木要打药

题目:

2024-03-06 21:48:15 234

原创 lanqiao:座次问题

代码实现:

2024-03-05 21:50:50 141

原创 lanqiao:公平抽签

先依次递归调用,找到符合要求的组合后加入结果集并返回上一层;再次寻找符合要求的组合再加入结果集。典型的组合枚举问题(有模板)。

2024-03-04 23:44:29 210

原创 lanqiao:42点

2.创建二维数组存放枚举的结果,第一行一个数字13;第二行4个数字,分别是13和1的加减乘除;第三行16个数字,分别是第二行的每个数和12加减乘除的结果;3.最后一行就是把所有最终结果枚举了出来,查找42即可。二维数组中每行长度不一样,需要格外小心!1.首先,把字符转成数字。

2024-03-03 23:38:46 263

原创 leetcode:37.解数独

题目理解:本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深。

2024-03-02 23:44:08 357 1

原创 leetcode:51.N皇后(复习)

树形结构——层数代表行数,递归的深度就是总行数。题目理解:(回溯算法)

2024-03-02 23:34:06 227 1

原创 leetcode:860.柠檬水找零

解题思路:贪心策略:针对支付20的客人,优先选择消耗10而不是消耗5,因为5可以用来找零10或20.题意:按照支付顺序,进行支付,能够正确找零。代码实现:有三种情况(代表三种面值)

2024-02-29 17:58:53 336 1

原创 leetcode:135.分发糖果

解题思路:分发糖果时,既要考虑左面,又要考虑右面,如果同时考虑,就会顾此失彼,所以我们可以先考虑右边,再考虑左边,分别正序、逆序进行遍历。逆序遍历时相当于重置candy数组。运用贪心算法,局部最优导致全局最优。

2024-02-28 15:31:20 352

原创 leetcode:134.加油站

这个起始位置是不会从中间开始的,运用反证法可以证明,如果从中间作为起始位置,那就不会从区间后一个位置当成起始点开始了,而是会在遍历到中间时将中间那个点直接作为起始位置。代码实现:局部最优:当遍历数组进行求和时,一旦这个和为负数,就从这个数后一个位置开始作为起始点。模拟过程:for循环主要是用来模拟线性的过程,而在这里它是环状的;解题思路:需要注意开始时的编号,有的可以走一圈,有的走不了。可以用暴力解法,但是在这里我用贪心来解决。注意:[g-s]数组总和小于0,返回-1。

2024-02-27 21:58:28 383

原创 leetcode:47.全排列2

2.树形结构:先将原来的数组进行排序,方便之后的去重!同一数层上不能取重复的元素!1.与上一题不同的是,本题目的数组中有重复的数字,所以最终结果需要去重!1.当path的长度==nums的长度时,将其加入结果中。2.根据used数组确定去重操作。

2024-02-26 10:13:56 245

原创 leetcode:46.全排列

3.代码实现:(循环从i=0开始,而不是从i=startIndex开始,因为想要从取过的数后面开始取数)使用used数组进行标记取过的元素,一个元素一个元素地进行取值,取完之后将used数组进行标记。

2024-02-25 23:39:56 912

原创 leetcode:491.递增子序列

2.树形结构:一个一个取数,然后保证是递增序列,且不能重复。(数层上不可以重复取,树枝上可以重复取)收集的结果不光是叶子节点。1.误区:不能直接对数组排序再求解子集,因为那样就改变了原有数组的顺序。3.代码实现:(去重方法:记录本层递归用到了哪些元素,不要重复)所以注意两点:数层节点去重、满足递增条件。

2024-02-25 00:26:03 307

原创 leetcode:90.子集2

这道题目和78.子集区别就是集合里有重复元素,而且求取的子集要去重。

2024-02-24 00:23:59 110

原创 leetcode:78.子集

1.树形结构:往后依次取该数字往后的数字(前面的不要取,否则子集会重复);每一层递归的结果都要放入结果集,而并非只放叶子节点。进入循环(path是从上往下一条路径过程中的数组)#达到了叶子节点(终止条件)

2024-02-22 20:31:47 345

原创 leetcode:93.复原IP地址

判断字符串的startIndex到s.size()-1区间(左闭右闭)是否合法,如果合法,加入结果集并返回。if (isvalid(s,startIndex,i)):(子串)参数s,startIndex,pointSum。终止条件:pointSum == 3。

2024-02-21 12:13:16 338

原创 leetcode:474.一和零

dp数组含义:dp[i][j]表示在i个0,j个1的情况下,最多背dp[i][j]个物品,最后结果是dp[m][n].背包(即最终结果数组包含有m个0和n个1)容量有两个维度,m个0和n个1,最终结果含有的元素个数相当于物品个数。由于每个物品只能使用1次,所以这依然是个01背包问题。递推公式:dp[i][j] = max(dp[i-x][j-y] + 1,dp[i][j])初始化:dp[0][0] = 0,非0下标初始化成0(由递推公式得)遍历顺序:先物品再背包(倒序),这里背包容量是二维的。

2024-02-20 13:16:01 340

原创 leetcode:494.目标和

递推公式:d[j] = d[j] + d[j-numbers[i]](放i和不放i)初始化:dp[0] = 1(装满容量为0的背包有1种方法),其余非0下标初始化为0。解题思路:1.因为每个数字都有正负两种选择,所以可以采用回溯算法。2.分成两个集合,分别为正数集合(left)和负数(right)集合。dp数组含义:装满容量为j的背包的方法。如果不能整除,则凑不出target。

2024-02-20 12:38:39 289

原创 leetcode1049:最后一块石头的重量二

代码实现:求出dp[target]之后,求(sum - dp[target])-dp[target]dp[j]:背包容量为j的背包最大重量(价值)为dp[j]把石头堆分割成差不多的两堆,使得两堆差值最小。初始化:(dp数组的大小根据题目进行定义)其余非0下标也初始化为0。先物品再背包(倒序)

2024-02-19 16:34:16 311

原创 leetcode:416.分割等和子集

递推公式:dp[j] = max(dp[j],dp[j-numbers[i]] + numbers[i])转化为01背包问题,集合中每个元素只能用一次,看能不能凑出sum//2这个重量。代码实现:(需要判断最终dp[num] = num,num = sum//2)一维的滚动dp数组必须注意遍历顺序,先物品再背包(倒序)初始化:dp[0] = 0,非0下标也初始为0。dp含义:前重量j所获得的最大价值。

2024-02-18 11:24:59 180

原创 动态规划--->背包问题理论基础(一维dp)

题目:三种物品的编号,重量和价值--->(0,1,15)和(1,3,20)和(2,4,30)(把第i-1层拷贝到第i层进行计算,相当于矩阵压缩成一行,形成 滚动数组)dp数组含义:dp[j]:表示容量为j的背包所容纳的最大价值。所以必须是先遍历物品(正序)后遍历背包(倒序)。如果正序遍历背包,那么物品有可能会放入多次!只有倒序遍历背包,才能保证每个物品只能放入一次!

2024-02-17 19:50:31 171

原创 动态规划--->背包问题理论基础(二维dp)

(针对二维dp数组解决01背包问题,两层for循环可以调换,因为只要(i,j)正上方和左上方有数值即可)题目:三种物品的编号,重量和价值--->(0,1,15)和(1,3,20)和(2,4,30)dp[i,j]:[0,i]物品任取放入容量为j的背包的最大价值(i表示物品编号)放物品i:dp[i-1][j-wight[i]] + value[i]dp[i,j] = max(不放,放)完全背包:n个物品每种都有相同数量个。多重背包:n个物品每种都有不同数量个。不放物品i:dp[i-1][j]

2024-02-17 16:00:16 226

原创 leetcode:96.不同的二叉搜索树

j相当于是头节点的元素,j-1相当于以j为头节点左子树节点数量,i-j以j为头节点右子树节点数量。dp[1] = 1(可以从递推公式推出来,可以不初始化0)头1 = 左子树0节点(个数)x右子树2个节点(个数)头2 = 左子树1节点(个数)x右子树1个节点(个数)头3 = 左子树2节点(个数)x右子树0个节点(个数)代码实现:(最后如果结果有问题,记得打印dp数组)从左往右,根据递推公式可知。将i遍历到j,进行累加。

2024-02-16 16:02:41 502

原创 二叉树理论基础

二叉搜索树,左子树均小于根节点,右子树均大于根节点,对节点结构无要求。结构体包括:数值,左右指针,构造函数(方便对其进行初始化)。线性存储:数组存储,i的左孩子2i+1,右孩子2i+2。深度优先,递归(栈)、迭代--->前中后顺序遍历。满二叉树,节点数量是2的k次方减1,k为深度。广度优先:迭代 (队列) --->层序遍历。平衡二叉搜索树:左右子树高度差不能超过1。完全二叉树,节点连续,堆的本质。

2024-02-16 15:18:09 108

原创 leetcode:343.整数拆分

遍历顺序:根据递推公式,dp[i] = max(dp[i],max(dp[i-j]*j,(i-j)*j)),所以是从前往后遍历,先有dp[i-j]再有dp[i]。有两种方案:i拆分出来j之后一是不再进行拆分,二是继续拆分。递推公式:j x dp[i-j](固定j,只通过凑dp[i-j]进而实现所有情况)拆分的越多越好(暂且认为),尽可能拆成m个近似相等的数,会使得乘积最大。初始化:dp[0] = 0,dp[1] = 0,dp[2] = 1。dp含义:将i进行拆分得到最大的积为dp[i]

2024-02-15 21:31:08 383

原创 leetcode:K次取反后的最大化的数组和

2.遍历数组,如果该数字小于0且k大于0,进行取反;如果k没有用完,将最小的正数进行取反(该数列全为正数),若k为奇数,将最后一个数进行取反,若k为偶数,该数列正负不变。数组里有正数有负数,先对绝对值最大的负数进行取反;若数组里全是正数,对最小的正数进行取反。1.对数组进行排序,按绝对值从大到小进行排序。

2024-02-14 16:03:49 101

原创 leetcode:45.跳跃游戏二

for循环遍历数组,使得next指向下一步能够覆盖的最远距离,如果i指向了cur,也就是当前覆盖的最远距离,result加一,当前依然没有到达终点,将next赋值给cur,去寻找下一个最远覆盖范围,如果超过了数组长度,跳出循环,上面的result值就是最终结果。用最少的步数增加覆盖范围,直至覆盖到终点。初始化cur,next,result为0。如果数组长度为1,返回0。

2024-02-14 12:40:43 770

原创 leetcode:55.跳跃游戏

2.循环遍历覆盖范围,选取最大的覆盖范围;若覆盖范围覆盖到了最后一个元素,直接返回true.1.若数组长度等于1,直接返回True。1.解题思路:贪心算法看最大覆盖范围。3.代码:(贪心无套路)

2024-02-13 17:47:53 935

原创 leetcode:买卖股票最佳时机二

使用贪心算法:局部最优是将买卖过程中产生的正数进行相加,进而使得最后结果最大(全局最优)。2.result += 正数,,正数和0比较。1.循环中下标从1开始。正数相加就得到了最大。

2024-02-12 22:41:49 342

原创 leetcode:131.分割回文串

for循环i==startIndex到s.size,在这个循环里判断是否符合回文串,若符合加入path,进行递归,最后进行回溯。当分割线到字符串末尾时到叶子节点,一种方案出现。参数字符串s和startIndex切割线。切割到字符串的尾部,就是叶子节点。

2024-02-11 15:11:01 364

原创 leetcode:51.N皇后

起初会想到暴力,但是N不确定,所以不确定for的嵌套层数,所以我们采用回溯算法。1.result是三维数组,一个棋盘是二维,N个是三维。4.isValid函数判断在该位置是否能够放置皇后。3.在for循环里已经判断了棋盘是否合法。2.叶子节点是结果,放入结果集。2.树的宽度是对每一行进行遍历。1.树的深度是第depth层。

2024-02-10 18:44:39 342

原创 leetcode:63.不同路径二

2.dp[i][0] == 1和dp[0][j] == 1的for循环条件都需要加上一个and dp[i][0] == 0和and dp[0][j] == 0.初始化:1.若起始位置和终止位置有障碍路径个数为0。dp数组含义:由初始位置到最终位置路径个数。递推公式:如果没有障碍再进行递推公式。

2024-02-09 17:16:55 408

空空如也

空空如也

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

TA关注的人

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