自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Day38| 322. 零钱兑换、279.完全平方数、139.单词拆分

设。

2025-08-02 11:25:57 109

原创 Day37| 完全背包、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]下标非0的dp[i]初始化为0,因为dp[i]是靠dp[i-j]累计上来的,dp[i]本身为0这样才不会影响结果。中我们都讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];

2025-08-01 18:23:15 211

原创 Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零

解题关键:找到重量和尽量相等的两堆确定dp数组以及下标的含义dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。确定递推公式01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);dp数组初始化确定遍历顺序int sum=0;sum+=stone;i++){j--){

2025-07-31 15:24:58 235

原创 Day35| 01背包问题 二维、01背包问题 一维、416. 分割等和子集

最终递推公式:dp[i][j]=Math.Max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])最终递推公式:dp[j]=Math.Max(dp[j],dp[j-weight[i]]+value[i]])放物品i:dp[i-1][j-weight[i]]+value[i]放物品i:dp[j-weight[i]]+value[i]]不放物品:dp[j]=dp[j](拷贝下来)背包容量为0时,存放任何物品,初始化都是0。不放物品i:dp[i-1][j]

2025-07-30 16:20:29 309

原创 Day34| 62.不同路径、63. 不同路径 II、343. 整数拆分

对于每种拆分方式,有两种选择:直接使用 j*(i-j) 作为乘积,或者使用 j 乘以 (i-j) 的最大拆分乘积 (dp [i-j])尝试将 i 拆分为 j 和 (i-j),其中 j 从 1 到 i/2(因为拆分具有对称性)创建一个 dp 数组,其中 dp [i] 表示整数 i 拆分后的最大乘积。初始化 dp [2] = 1,因为 2 只能拆分为 1+1,乘积为 1。动归五部曲中的初始化,如果一旦遇到障碍物,该行或该列就停止初始化1。取所有可能拆分方式中的最大值作为 dp [i]

2025-07-29 16:12:56 308

原创 Day32| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

可以选择爬 1 或 2 个台阶,可以从下标。

2025-07-27 00:01:17 562

原创 Day31| 56. 合并区间、738.单调递增的数字、968.监控二叉树

遍历集合,如果某元素的左边界大于上一个元素的有边界,没有重叠区间;如果某元素的左边界小于上一个元素的右边界,有重叠区间,更新前一个元素的右边界为当前元素的右边界。从下往上看,让叶子节点的父节点安装摄像头,然后每隔两个安装一个摄像头,直到二叉树的头结点。这样可以保证后一个区间的起点 ≥ 前一个区间的起点,为后续合并做准备。本节点有覆盖(为了减少摄像头数量,将空节点状态视为有覆盖)--2。从flag开始,将所有的位置设置为9,保证是最大的合法数。左右节点至少有一个有摄像头→中间节点是已覆盖的状态。

2025-07-25 14:18:33 334

原创 Day30| 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

遍历集合,如果某元素的左边界大于上一个元素的右边界,没有重叠了;反之,某元素的左边界小于上一个元素的右边界,重叠了,count++遍历气球,如果气球的起点大于上一个气球的终点,还需要一支箭;反之,取前两个气球的终点的最小是,继续循环。创建一个长度为27的数组,用于记录每个小写字母最后一次出现的位置,存于location数组中。创建left、right,遍历字符串,用right记录当前片段中所有字符的最远位置。如果不重叠,说明可以保留当前区间,更新。,初始为第一个区间的结束时间。,记录需要删除的数量。

2025-07-24 17:49:13 220

原创 Day29| 134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

如果从 A 出发到不了 B,那从 A 和 A 与 B 之间任何一个点出发都不可能到达 B。账单是20元,找一个10元一个5元(优先) / 找三个五元。贪心,两次遍历,分别满足左边和右边评分比较的要求;两次处理后,最终分配满足所有条件,并且总量最少。),说明整个油都不够消耗 → 直接返回。参照分发糖果的思路,一定要分成两边来考虑。表示从当前起点出发,当前积累的油量。,说明当前起点不行(中途油不够了)右边孩子比左边孩子大(顺序遍历)左边孩子比右边孩子大(倒序遍历)先确定身高的维度,从大到小排序;

2025-07-24 14:56:11 310

原创 Day28| 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II、1005.K次取反后最大化的数组和

还是和上题大致思路一致,确定覆盖范围,覆盖范围内一定可以跳到。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。只要明天比今天贵,就在今天买入,明天卖出,把这个差价加到总利润中。第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完。若k还有剩余且是奇数,就反转一次降序排序后的最后一个数;第二步:从前向后遍历,遇到负数将其变为正数,同时K--累加每一段上涨的差价,就是所有可能的收益之和;如果是负的(明天价格更低),

2025-07-22 10:58:27 863

原创 Day27| 理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

明确如果当前数是负数,那么如果继续往后面加新数,只会拖累总和,让总和越来越小。如果当前数数是正数,那么将每个当前和存入数组,然后不断加入,比较和的大小;如果是负数,直接跳过。单调坡上有平坡:prediff只记录当下一个坡度变化时首个坡度,直到遇到下一个摆动坡度改变方向时再变化。首尾元素:只有两个元素,再前面造一个平坡,最右边元素默认有一个摆动/也可以写死,如果只有两个元素,只要不同,摆动就是2。如果当前最大的饼干可以满足当前的小孩,res++表示一个小孩被满足,index--表示用了一块饼干。

2025-07-21 15:15:53 255

原创 Day25| 491.递增子序列、46.全排列、47.全排列 II、回溯总结

已经在当前 for 循环层尝试过了,也跳过(避免重复分支)。每个位置都尝试一个未使用过的数字,直到构成一个完整排列。回溯时撤销选择(移除 path 最后一个元素,并将。数组标记哪些数字已经被使用,避免重复。比 path 中最后一个元素小,说明。依赖于系统栈自动回溯到上一层状态。表示当前正在构造的排列路径。若未被使用,则加入 path;,保证从左到右、不回头。,尝试所有可能路径。

2025-07-20 15:22:18 372

原创 Day24| 93.复原IP地址、78.子集、90.子集II

本文介绍了回溯算法在解决IP地址复原和子集问题中的应用。对于IP地址复原,通过递归分割字符串并验证每段合法性,使用回溯添加/删除分隔符。子集问题则通过遍历所有可能组合,其中子集II通过排序和跳过重复元素来去重。关键点包括递归参数设计、终止条件判断以及剪枝优化,展现了回溯算法在组合问题中的通用解决模式。代码实现上,均采用路径记录、结果收集和回溯撤销的经典结构,体现了算法的一致性和可扩展性。

2025-07-18 14:37:29 322

原创 Day23| 39. 组合总和、40.组合总和II、131.分割回文串

递归函数参数 集合candidates、目标值target、和sum、控制for循环的起始位置startIndex。(Palindromic String)是指从左到右读和从右到左读完全相同的字符串,其字符序列呈现 “对称” 特征。单层搜索的逻辑 单层for循环依然是从startIndex开始,搜索candidates集合。本题candidates 中的每个数字在每个组合中只能使用一次。本题数组candidates的元素是有重复的,而。树层去重:一个维度是同一树层上使用过(采用)(两个相同字符构成回文)。

2025-07-17 13:17:22 925

原创 Day22| 回溯算法理论基础、第77题. 组合、216.组合总和III、17.电话号码的字母组合

本文介绍了回溯算法的理论基础及其在组合问题中的应用。通过三个典型例题(组合、组合总和III、电话号码字母组合),详细讲解回溯算法的实现步骤:1. 确定递归函数参数和返回值;2. 设置终止条件;3. 设计单层搜索逻辑。针对组合问题,给出了剪枝优化方法以提升效率。每个例题都提供了完整的C#代码实现,包括回溯框架、结果收集和剪枝处理。文章特别强调了回溯三部曲(参数确定、终止条件、搜索过程)在解题中的关键作用,展示了如何通过回溯算法高效解决排列组合类问题。

2025-07-16 15:11:45 407

原创 Day21| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

2025-07-15 14:54:09 412

原创 Day20| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

因为是二叉搜索树,所以右子树>根节点>左节点,在找最近的公共祖先时,如果p、q节点均比根节点大,那么最近公共祖先应该在右子树中寻找;如果p比根节点小&&q比根节点大,那么最近公共祖先就是该根节点。删除节点左右均不为空→左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置。删除节点左为空,右不为空→删除节点,右孩子补位,返回右孩子为根节点。删除节点左不空,右为空→删除节点,左孩子补位,返回左孩子为根节点。删除节点为叶子节点,左右均为空→直接删除节点。

2025-07-14 11:27:56 497

原创 Day18| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

还是按照中序遍历的思路,首先遍历左子树,再进行一系列处理:如果前指针等于当前指针,count++;如果count>maxcount,讲count赋值maxcount,原result集合清空,讲新的maxcount放进result。如果左子树为空,右子树不为空,说明pq在右子树中,返回root.right;公共祖先:对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(注意这是二叉搜索树,是有序的,所以要是相等的话,只有pre和cur相等。

2025-07-12 23:36:07 301

原创 Day17| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;右子树是通过数组中最大值右边部分构造出的最大二叉树。如果某一方节点为空,合并结果使用另一个非空节点;如果当前节点为空,说明没找到,返回 null;如果两个节点都存在,则新节点值为两者之和;用来记录上一个访问过的节点值,初始化为。如果当前节点值等于目标值,返回当前节点;如果目标值比当前节点大 → 去右子树。它的左、右子树也分别为二叉搜索树。二叉树的根是数组中的最大元素。

2025-07-11 14:44:36 531

原创 Day16| 513.找树左下角的值、112. 路径总和、113.路径总和、106.从中序与后序遍历序列构造二叉树

使用广度优先搜索(BFS)逐层遍历树,记录每一层最左边的节点,最后返回最后一层最左边的值。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)把中序中的数组inorder中的值和索引记录在字典中,接着找到后续遍历中的最后一个值。,优先遍历左子树,记录当前最深的叶子节点的值,并更新最终结果。BFS是从左往右遍历,存放第一个节点,就是每一层的最左节点。如果当前节点是叶子节点(左右子节点都为空),并且此时。第五步:切割后序数组,切成后序左数组和后序右数组。

2025-07-10 17:03:53 960

原创 Day15| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

使用前序遍历(根 -> 左 -> 右),从根节点出发,记录当前路径。

2025-07-09 17:56:03 593

原创 Day14| 226.翻转二叉树 、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

注意与最大深度的区别,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度;反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)

2025-07-09 15:17:41 447

原创 Day13| 递归遍历 、迭代遍历 、统一迭代、层序遍历

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。利用栈进出特性,最后转换为数组,处理节点时,前序需要得到左右,栈获取时需要右左。(前序)中左右(左右交换)→中右左(整体翻转)→左右中(后序)次,从队列中依次取出当前层的所有节点,放进。

2025-07-07 18:18:19 180

原创 Day11| 150.逆波兰表达式求值、239. 滑动窗口顶部

使用一个双端队列。

2025-07-05 16:47:13 572

原创 Day10| 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

本文摘要: 介绍了栈和队列的基本特性,以及如何用栈实现队列和用队列实现栈的方法。通过两个栈(inStack和outStack)的配合可以实现队列的先进先出特性;而单队列通过旋转操作可以模拟栈的先进后出。还讲解了有效括号匹配的三种情况和删除字符串相邻重复项的算法。所有方法都包含完整的C#实现代码,展示了数据结构之间的相互转化技巧。

2025-07-04 15:21:23 315

原创 Day9| 151.翻转字符串里的单词、卡码网:55.右旋转字符串、实现 strStr() 、重复的子字符串 、字符串总结、双指针回顾

这篇文章主要讲解了字符串处理的三个算法:1. 翻转字符串中的单词(151题),通过三步实现:去除多余空格、整体反转、单词反转;2. 右旋转字符串(55题),采用三次反转法:先局部反转再整体反转;3. KMP算法(实现strStr()),但作者表示尚未完全理解。文中还介绍了C#和Java的具体实现方法,以及双指针在数组、字符串、链表中的应用技巧。最后提到哈希表处理N数之和等问题的关键点。

2025-07-03 18:10:25 346

原创 Day8| 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

字符串处理技巧总结:本文介绍了三种字符串反转方法(双指针、库函数、Span切片)和数字替换的实现。重点包括:1. 双指针法交换元素实现反转;2. 使用StringBuilder和Substring处理分段反转;3. Span的高效内存操作;4. Java中通过Character.isDigit()和StringBuilder实现数字替换。各种方法对比展示了不同场景下的最优解,强调理解底层原理的重要性。代码示例覆盖了C#和Java两种语言的关键实现。

2025-07-02 16:09:39 829

原创 Day7| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

剪枝操作:目标值没有写死,target可能是正数,也可能是负数,所以不存在判断nums[k]>target就直接返回,取而代之应该是nums[k]>target&&nums[k]>0&&target>0 → break;将四个数组分成2+2,需要存储两个值,一个用来存储前两个数组的总和,一个用来存储相同的两个数出现几次。遍历前两个数组,两两配对,数据a1和数据b1根据0-(a1+b1),明确需要在后两个数组中找到和为0-(a1+b1)的两个数。最终,在后两个数组中找到的值,对应一共有value个组合。

2025-07-01 18:15:46 260

原创 Day5| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

哈希表都是用来快速判断一个元素是否出现集合里的哈希法有三种应用:数组、map、set。

2025-06-30 17:44:57 356

原创 Day4| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、链表相交、142.环形链表II

编码实现: 假设A链表未相交部分是a长度,B链表未相交部分是b长度,相交部分后为c长度. 此时,让HeadA走完A链表后走B链表、HeadB走完B链表后走A链表,二者最后相遇在交点 HeadA:a+c+b HeadB:b+c+a。理清思路:倒数第n个,假设总长度为k,指定节点前有k-n个节点,只需要在遍历时,删除第k-n个节点,但是,题目没有告诉k,所以需要这种方法确定节点位置:让快指针先于慢指针n位,等快指针遍历完成,慢指针所指下一位置就是目标节点。若pA==null→pA==headB。

2025-06-28 17:15:57 309

原创 Day3| 203.移除链表元素、707.设计链表、206.反转链表

虽然是二刷,还是有不少地方没有考虑到,一些思路没有理解透彻。

2025-06-27 15:54:26 301

原创 Day2| 209.长度最小的子数组、59.螺旋矩阵II、区间和、开发商购买土地

分情况讨论:若是横向切割,遍历i,通过二维公式得出topsum的值,再根据tota-top计算出bottom;滑动窗口:本质上也是双指针,一个左指针、一个右指针,右指针持续后移,在遇到总和大于target后,移动左指针,并比较子数组的大小;确定n*n的矩阵,需要走多少圈,定义loop变量:如果是奇数,走n/2圈,中间还剩唯一的一个数;确定每条边的起始位置以及终止的判断条件,需要引入变量offset,每走一圈,offset+1;问题:在c#中,int[][] result = new int[n][];

2025-06-26 18:32:08 316

原创 Day1| 704. 二分查找、27. 移除元素、977.有序数组的平方

本文总结了二分查找和双指针技巧在LeetCode题目中的应用。二分查找要求数组有序且无重复元素,重点讲解了左闭右闭和左闭右开两种区间处理方式,并给出了704题的解题代码。双指针法在27题移除元素和977题有序数组平方中都有应用,前者通过快慢指针原地修改数组,后者通过头尾指针比较平方值进行排序。文章强调代码实现时需注意边界条件,如数组下标、循环终止条件等细节问题,建议写完代码后仔细检查。二刷经验表明思路易掌握但细节仍需谨慎处理。

2025-06-25 15:32:17 722

原创 代码随想录 leetCode 数组

本文总结了算法刷题中数组相关的重要知识点,包括多种算法实现技巧。主要内容涵盖:二分查找的左闭右闭和左闭右开区间处理;双指针在移除元素和有序数组平方问题中的应用;滑动窗口解决最小子数组问题;螺旋数组的循环构建方法;以及前缀和在区间和计算中的高效应用,包括一维和二维前缀和的实现公式。这些方法通过不同的指针技巧和预处理手段,有效优化了数组相关问题的解决效率。

2025-06-20 18:20:32 278

空空如也

空空如也

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

TA关注的人

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