![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录
文章平均质量分 96
君君超有趣
这个作者很懒,什么都没留下…
展开
-
代码随想录训练第三十四天|LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍 III
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:示例 2:提示:Related Topics数组动态规划大家如果刚接触这样的题目,会有点困惑,当前的状态我是偷还是不偷呢?仔细一想,当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。所以这里就更感觉原创 2024-08-01 02:47:12 · 163 阅读 · 0 评论 -
代码随想录训练第三十三天|LeetCode322. 零钱兑换、LeetCode279.完全平方数、LeetCode139.单词拆分、多重背包、背包总结
背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。原创 2024-07-31 18:58:27 · 565 阅读 · 0 评论 -
代码随想录训练第三十二天|完全背包理论基础、LeetCode518.零钱兑换II、LeetCode377. 组合总和 Ⅳ、卡码网70. 爬楼梯(进阶版)
细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,原创 2024-07-31 02:07:29 · 744 阅读 · 0 评论 -
代码随想录训练第三十一天|LeetCode1049.最后一块石头的重量II、LeetCode494.目标和、LeetCode474.一和零
有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x原创 2024-07-30 03:15:27 · 896 阅读 · 0 评论 -
代码随想录训练第三十天|01背包理论基础、01背包、LeetCode416.分割等和子集
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程 dp[i] [j] = max(dp[i - 1] [j], dp[i - 1] [j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。dp[0] [j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。原创 2024-07-28 04:41:41 · 492 阅读 · 0 评论 -
代码随想录训练第二十九天|LeetCode62.不同路径、LeetCode63.不同路径 II、LeetCode343. 整数拆分、LeetCode96.不同的二叉搜索树
那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式dp[i] [j] = dp[i - 1] [j] + dp[i] [j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i] [j]的时候,dp[i - 1] [j] 和 dp[i] [j - 1]一定是有数值。这里要看一下递推公式dp[i] [j] = dp[i - 1] [j] + dp[i] [j - 1],dp[i] [j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。原创 2024-07-24 23:56:57 · 878 阅读 · 0 评论 -
代码随想录训练第二十八天|动态规划理论基础、LeetCode509 斐波那契数、LeetCode70.爬楼梯、LeetCode746.使用最小花费爬楼梯
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。原创 2024-07-23 14:48:37 · 525 阅读 · 0 评论 -
设计模式第二天|设计模式创建型:工厂模式、抽象工厂模式、单例模式、建造者模式
简单工厂模式其实并不算是一种设计模式,更多的时候是一种编程习惯。简单工厂的实现思路是,定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。封装一个复杂对象构造过程,并允许按步骤构造。就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单对象组合起来构建出复杂对象。原创 2024-07-22 23:30:32 · 857 阅读 · 1 评论 -
代码随想录训练第二十七天|LeetCode56.合并区间、LeetCode738.单调递增的数字、LeetCode968.监控二叉树
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。那么空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。原创 2024-07-22 18:19:42 · 576 阅读 · 0 评论 -
代码随想录训练第二十六天|LeetCode452. 用最少数量的箭引爆气球、LeetCode435.无重叠区间、LeetCode763.划分字母区间
寻找重复的气球,寻找重叠气球最小右边界,其实都有代码技巧。原创 2024-07-20 19:43:33 · 954 阅读 · 0 评论 -
代码随想录训练第二十五天|LeetCode134.加油站、LeetCode135.分发糖果、LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列
这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。一次是从左到右遍历,只比较右边孩子评分比左边大的情况。一次是从右到左遍历,只比较左边孩子评分比右边大的情况。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。原创 2024-07-20 01:05:45 · 812 阅读 · 0 评论 -
代码随想录训练第二十四天|LeetCode122.买卖股票的最佳时机II、LeetCode55. 跳跃游戏、LeetCode45.跳跃游戏 II、LeetCode1005.K次取反后最大化的数组和
这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。一些同学可能感觉,我在讲贪心系列的时候,题目和题目之间貌似没有什么联系?是真的就是没什么联系,因为贪心无套路!没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维!贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?原创 2024-07-18 14:15:06 · 711 阅读 · 0 评论 -
代码随想录训练第二十三天|了解贪心算法、LeetCode455.分发饼干、LeetCode376.摆动序列、LeetCode53.最大子序和
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。原创 2024-07-17 16:04:04 · 735 阅读 · 0 评论 -
代码随想录训练第二十二天|LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II、LeetCode332.重新安排行程、LeetCode51.N皇后、..
回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。原创 2024-07-17 01:07:49 · 602 阅读 · 0 评论 -
代码随想录训练第二十一天|LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II
递归调用时,下一层递归的startIndex要从i+1开始(因为是在新的字符串上边进行添加),同时记录段数number要 +1。求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。区别就是集合里有重复元素了,而且求取的子集要去重。原创 2024-07-16 01:41:25 · 533 阅读 · 0 评论 -
代码随想录训练第二十天|LeetCode39.组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
给你一个 无重复元素 的整数数组 和一个目标整数 ,找出 中可以使数字和为目标数 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 的不同组合数少于 个。示例 1:示例 2:示例 3:提示:Related Topics数组回溯题目中的无限制重复被选取,吓得我赶紧想想 出现0 可咋办,然后看到下面提示:1原创 2024-07-14 15:46:50 · 957 阅读 · 0 评论 -
代码随想录训练第十九天|回溯算法基础理论、LeetCode77.组合、LeetCode216.组合总和III、LeetCode17.电话号码的字母组合
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。本篇我们讲解了,什么是回溯算法,知道了回溯和递归是相辅相成的。接着提到了回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。然后列出了回溯法可以解决几类问题,可以看出每一类问题都不简单。原创 2024-07-13 00:21:44 · 977 阅读 · 0 评论 -
代码随想录训练第十八天|LeetCode669.修剪二叉搜索树、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树、二叉树总结
关于二叉树,你该了解这些!:二叉树的种类、存储方式、遍历方式、定义方式涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。所以求普通二叉树的属性还是要具体问题具体分析。原创 2024-07-12 02:04:51 · 1040 阅读 · 0 评论 -
代码随想录训练第十七天|LeetCode235. 二叉搜索树的最近公共祖先、LeetCode701.二叉搜索树中的插入操作、LeetCode450.删除二叉搜索树中的节点
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题 (opens new window)简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。原创 2024-07-11 04:33:56 · 951 阅读 · 0 评论 -
代码随想录训练第十六天|LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236. 二叉树的最近公共祖先
那么我给大家归纳如下三点求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。可以说这里每一步,都是有难度的,都需要对二叉树,递归和回溯有一定的理解。原创 2024-07-09 22:58:13 · 994 阅读 · 0 评论 -
代码随想录训练第十五天|LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树
因为是传入了两个树,那么就有两个树遍历的节点root1和 root2,如果root1== NULL 了,两个树合并就应该是 root2了(如果root2也为NULL也无所谓,合并之后就是NULL)。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。其实本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。递归函数的返回值是什么?原创 2024-07-09 01:38:16 · 1001 阅读 · 0 评论 -
代码随想录训练第十四天|LeetCode513.找树左下角的值、LeetCode112.路径总和、LeetCode113. 路径总和ii、LeetCode106.从中序与后续遍历序列构造二叉树
递归求深度的写法,我们在110.平衡二叉树 (opens new window)中详细的分析了深度应该怎么求,高度应该怎么求。递归中其实隐藏了回溯,在257. 二叉树的所有路径 (opens new window)中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。层次遍历,在二叉树:层序遍历登场!深度讲解了二叉树层次遍历。所以本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了.原创 2024-07-08 01:13:16 · 954 阅读 · 0 评论 -
代码随想录训练第十三天|LeetCode110.平衡二叉树、LeetCode257.二叉树的所有路径、LeetCode404.左叶子之和、LeetCode222.完全二叉树的节点个数
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。原创 2024-07-06 05:15:45 · 914 阅读 · 0 评论 -
代码随想录训练第十二天|LeetCode226.翻转二叉树、LeetCode101. 对称二叉树、LeetCode104.二叉树的最大深度、LeetCode111.二叉树的最小深度
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。原创 2024-07-05 09:30:00 · 752 阅读 · 0 评论 -
代码随想录训练第十一天|二叉树基础理论、二叉树递归遍历、二叉树迭代遍历、二叉树统一迭代法、LeetCode102.二叉树层序遍历
二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,帮助大家扫一遍基础。原创 2024-07-04 03:07:00 · 1375 阅读 · 0 评论 -
代码随想录训练第十天|LeetCode150.逆波兰表达式求值、LeetCode239.滑动窗口最大值、LeetCode347.前 K 个高频元素、栈与队列总结
在栈与队列系列中,我们强调栈与队列的基础.我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。原创 2024-07-03 04:34:47 · 1033 阅读 · 0 评论 -
代码随想录训练第九天|栈与队列基础、LeetCode233.用栈实现队列、LeetCode225.用队列实现栈、LeetCode20.有效的括号、LeetCode1047.删除字符串中的所有相邻重复项
栈(Stack)是一种常见的数据结构,具有后进先出(LIFO,Last In First Out)的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部变量、操作数栈等。在计算机科学中,栈的应用非常广泛,包括编程语言中的函数调用、内存分配以及表达式求值等领域。在Java编程语言中,栈也被广泛应用于方法调用和内存管理的过程中。原创 2024-07-02 02:28:24 · 985 阅读 · 0 评论 -
代码随想录训练第八天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串、LeetCode28. 实现 strStr()、LeetCode459.重复的子字符串
KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。原创 2024-06-30 01:41:39 · 828 阅读 · 0 评论 -
代码随想录训练第七天|LeetCode344.反转字符串、LeetCode541. 反转字符串II、卡码网:54.替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。原创 2024-06-28 23:23:09 · 1312 阅读 · 0 评论 -
代码随想录训练第六天|LeetCode454.四数相加II、LeetCode383.赎金信、LeetCode15.三数之和、LeetCode18.四数之和
而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!原创 2024-06-27 22:21:50 · 771 阅读 · 0 评论 -
代码随想录训练第五天|LeetCode242.有效的字母异位词、LeetCode349. 两个数组的交集、LeetCode202. 快乐数、LeetCode1. 两数之和
首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 哈希表是根据关键码的值而直接进行访问的数据结构。原创 2024-06-26 18:48:20 · 717 阅读 · 0 评论 -
代码随想录训练第四天|LeetCode24.两两交换链表中的节点、LeetCode19.删除链表的倒数第N个节点、面试题 02.07.链表相交、LeetCode142.环形链表II
可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。原创 2024-06-26 01:11:09 · 1003 阅读 · 0 评论 -
代码随想录训练第三天|链表基础理论、LeetCode 203.移除链表元素、LeetCode707.设计链表、LeetCode206.反转链表
链表是一种通过指针串联在一起的线性结构,每个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针)。原创 2024-06-25 00:09:47 · 888 阅读 · 0 评论 -
代码随想录训练第二天|LeetCode977.有序数组的平方、LeetCode209.长度最小的子数组、LeetCode59.螺旋矩阵II、数组总结
在面试中,数组是必考的基础数据结构。其实数组的题目在思想上一般比较简单的,但是如果想高效,并不容易。我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。二分法这道题目呢,考察数组的基本操作,思路很简单,但是通过率在简单题里并不高,不要轻敌。可以使用暴力解法,通过这道题目,如果追求更优的算法,建议试一试用二分法,来解决这道题目暴力解法时间复杂度:O(n)二分法时间复杂度:O(logn)在这道题目中我们讲到了循环不变量原则。原创 2024-06-22 16:23:19 · 868 阅读 · 0 评论 -
代码随想录训练第一天|LeetCode704.二分查找、LeetCode34.在排序数组中查找元素的第一个和最后一个位置、LeetCode35.搜索插入位置、LeetCode27.移除元素
主要要明确区间的定义,再循环中一定要坚持提前定义好的区间,然后再进行边界处理,也就是循环不变量规则。给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。原创 2024-06-22 02:00:36 · 1311 阅读 · 0 评论