Leetcode算法刷题记录
文章平均质量分 91
报名了代码随想录刷题营,希望借此契机约束和鼓励自己坚持下去
恩爱鹿皮er
这个作者很懒,什么都没留下…
展开
-
Leetcoder Day43| 单调栈1
本题的意思是:有一长一短两个数组,短数组中的元素一定在长数组中出现过,但是两个数组的元素顺序不同,定义一个结果数组res,遍历短数组中的每一个元素,找出当前元素的值在长数组中的位置,在长数组的顺序中找出右边第一个更大的元素并返回这个元素的值,若右边没有更大的元素则返回-1。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。原创 2024-03-28 16:19:06 · 823 阅读 · 0 评论 -
Leetcoder Day42| 动态规划part09 打家劫舍问题
这里多了一个需要判断的条件就是:i是否为最后一个房子,如果是,则需要考虑第一个房子偷不偷的问题,如果第一个房子没有被选,则i 就只跟i-1是否被选有关系。本题思维和之前的打家劫舍是一样的,只不过数据形式换成了树,需要对树进行遍历,不能同时抢的条件变成抢了父亲节点就不能抢其对应的孩子节点,抢了孩子节点就不能抢对应的父亲节点。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。原创 2024-03-07 20:36:28 · 995 阅读 · 0 评论 -
Leetcoder Day41| 动态规划part08 背包问题
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。本题还是完全背包问题,因为可以重复使用字典中的单词,所以这里物品就是单词,容量为字符串,此外还要定义一个集合,统计单词的起止位置。s⚠️: 内层需要通过来判断dp[j]的值是否已经为true,如果是,则不需要再进一步检查,可以跳出内部循环,继续遍历下一个位置。原创 2024-03-06 17:09:21 · 897 阅读 · 0 评论 -
Leetcoder Day40| 动态规划part07
本题和昨天的零钱兑换题设最大的区别在于,求所需的最少的硬币个数。因此当满足条件时:判断dp[j]和dp[j-coins[i]]+1谁更小,输出更小的。,因为但凡一个整数都可以被1累加到,所以不需要判断剩下的数是否为完全平方数。这里需要注意的地方是⚠️:首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;给你一个整数 n ,返回和为 n 的完全平方数的 最少数量。dp含义:本题dp[j]就是和为j的最小完全平方数量。递推公式:dp[j]=dp[j-i^2]+1。当j=1 时 dp[j]=1。原创 2024-03-06 16:45:38 · 924 阅读 · 0 评论 -
Leetcoder Day39| 动态规划part06 完全背包问题
所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以这里还是以纯完全背包问题进行讲解理论和原理。因此,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。原创 2024-03-06 15:02:16 · 917 阅读 · 0 评论 -
Leetcoder Day37| 动态规划part04 背包问题
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。i是由i-1推出来的,所以i为0的时候就一定要初始化。刚才讨论过j=0的情况,那么i=0时,dp[0][j],即:存放编号0的物品时,各个容量的背包所能存放的最大价值。因此 j < weight[0]时,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。若j>=weight[0],dp[0][j]的值为value[0]。原创 2024-03-03 17:57:05 · 952 阅读 · 1 评论 -
Leetcoder Day36| 动态规划part03
⚠️本题的优化思路:其实将对于j的遍历条件改为: j<i-1可以节省一步计算,因为如果让j=i-1,其实在 j = 1的时候,这一步就已经拆出来了,属于重复计算,所以 j < i - 1。因为拆分一个数i使之乘积最大,比如i=x+(i-x) dp[i]=x(i-x)=xi-x^2,这时是一个向下的抛物线,最大点为x/2。返回你可以获得的最大乘积。即dp[3]=dp[2]*dp[0]+dp[1]*dp[1]+dp[0]*dp[2] ,本题需要注意的是,至少拆成2个正整数的和,而不是正好是2个正整数。原创 2024-03-03 16:02:27 · 863 阅读 · 0 评论 -
Leetcoder Day33| 贪心算法part06+总结
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x原创 2024-03-01 20:06:40 · 538 阅读 · 0 评论 -
Leetcoder Day32| 贪心算法part05
依旧是重叠区间问题,先按照start排序,再进行重叠判断,本题相邻区域也算重叠,因此若intervals[i][0]原创 2024-03-01 14:52:54 · 583 阅读 · 0 评论 -
Leetcoder Day26| 回溯part06:总结+三道hard题
回溯部分涉及到的题型比较多,而且在二叉树环节也用到了回溯。回溯的问题都可以抽象为树结构,并且其本质是递归,也就是,只要有递归就会有回溯!这次刷题从代码随想录里学到了很有用的回溯模板,但是也不能只依赖于套模板,要具体问题具体分析。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等void backtracking(参数) {原创 2024-02-27 21:11:09 · 1164 阅读 · 0 评论 -
Leetcoder Day25| 回溯part05:子集+排列
排列问题不需要使用startIdx因为可以存在重复取值的情况,比如第一次1被取过,形成[1,2,3],后面还可以再取组成[2,1,3],但是需要设置一个数组used来记录当前元素在同一path中是否使用过。从上图可以看到,如果在同一个父节点下,同一树层使用过的元素便不再取,如果所取元素小于子序列最后一个元素,也不符合条件。本题和上一题的区别在于有重复的数字,所以需要去重,先对数组进行排序,设置used数组记录是否使用过如果used[i-1]为true,说明同一树枝上使用过值一样的元素;原创 2024-02-27 18:50:38 · 1016 阅读 · 0 评论 -
Leetcoder Day21| 回溯理论基础+组合
这棵树一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。原创 2024-02-24 15:26:29 · 1049 阅读 · 0 评论 -
Leetcoder Day20| 二叉树 part09+总结
这道题的题设读起来比较拗口,翻译一下就是如果二叉树中有节点的值大于等于当前的节点,便将那些值累加变成当前节点新的值。这道题思路就比较简单,二叉搜索树的中序遍历本身就是有序数组,所以反过来将有序数组按照中序构建即为二叉搜索树。当遇到边界外的值,就进行删除,如果比low小,则将当前根节点及其左子树都删除,返回其右子树;改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。原创 2024-02-23 15:27:34 · 461 阅读 · 0 评论 -
Leetcoder Day19| 二叉树 part08
因此如果要找到最近的公共祖先,如下面的图所示,节点5位于p和q之间,如果继续向左或向右遍历,则错过了成为p或者q的祖先,因此5就是q和p的最近公共祖先。所以按照从上往下的顺序遍历,第一次遇到数值在p和q之间的,就是最近公共祖先。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。本题较简单的一个思路就是,判断待插入的值和根节点的关系,,然后将待插入的元素始终作为叶子节点插入即可。这两天完成了对二叉搜索树的增删还有搜索的操作,一定要记住二叉搜索树的特点,不需要遍历整棵二叉树。原创 2024-02-23 14:12:59 · 1142 阅读 · 0 评论 -
Leetcoder Day18| 二叉树 part07
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:遇到二叉搜索树,就要想到中序遍历是有序的,因此依然可以将二叉搜索树转换为中序遍历数组求解。给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。例如:给定 BST [1,null,2,2],⚠️注意最后findMode返回的是一个整数数组 (int[]),所以在定义res时,一定也要定义的是一个数组而不是一个整数。原创 2024-02-22 19:14:11 · 988 阅读 · 1 评论 -
Leetcoder Day17| 二叉树 part06
这道题我的第一个想法是建立一个哈希表,层次遍历并存储第一个树的位置和值,如果该位置没有节点则为-1,随后创建新的节点,遍历第二个树,若当前位置已经有节点,则将两个节点值相加返回;注意在Java中,如果将树转换为列表List,则需要用.get和size()来获取列表的值和长度,如果是数组,因为不知道树的节点个数,所以需要先设置一个很大的值,所以也可以先将树转换为列表,再将列表转换为数组。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。原创 2024-02-22 17:19:01 · 1018 阅读 · 1 评论 -
Leetcoder Day15| 二叉树 part04
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。truefalse这道题还是跟求最大深度有相似之处,求每个左子树和右子树高度差,如果有一对已经不满足了就返回false。因为getDepth返回的是高度,所以当不满足条件的时候,返回-1。给定一个二叉树,返回所有从根节点到叶子节点的路径。由于本题需要输出从根节点到叶子结点的路径,因此适合使用前序遍历,这样可以让父节点指向左右孩子节点找到路径。原创 2024-02-19 14:29:48 · 920 阅读 · 1 评论 -
Leetcoder Day14|二叉树part03
一般来讲,求高度用前序遍历,求深度用后序遍历,但是如果涉及到一棵树的最大最小深度时,可以将其转换为求根节点的高度,使用后序遍历来进行求解。原创 2024-02-19 12:35:36 · 1009 阅读 · 1 评论 -
Leetcoder Day11|栈与队列part03(队列的应用)
面试题:栈里面的元素在内存中是连续分布的么?陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢?答案是:不连续的,下文也会提到deque。原创 2024-01-17 15:42:44 · 823 阅读 · 0 评论 -
Leetcoder Day10|栈与队列part02(栈的应用)
只不过在括号里我们要判断的是不匹配的情况,而这里我们要删除匹配的情况因此可以将字符串遍历,先判断再入栈,如果当前字符与栈顶元素相同,则把栈顶元素弹出,如果不等,则放入栈中。,并且,先出现的左括号对应的右括号类型往往是后出现的,这个情况非常适合栈的特点,先进后出。本题思路可以简化为,遇到一个符号则把符号前面的拿出来进行符号对应的操作再压入栈中,很像上一题相邻重复项的思路,只不过这里的重复项定义为数字。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。原创 2024-01-17 13:17:18 · 875 阅读 · 0 评论 -
Leetcoder Day8|字符串part02
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。a[i]!= '\0';i++) {在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。i++) {那么vector< char > 和 string 又有什么区别呢。原创 2024-01-09 20:48:34 · 861 阅读 · 0 评论 -
Leetcoder Day9|栈与队列part01
语言:Java/C++理论基础又是考研时数据结构里接触到的老朋友,原创 2024-01-17 11:22:44 · 1033 阅读 · 0 评论 -
Leetcoder Day7|字符串part01
如果一道题能够用库函数直接解决,就不要用库函数,如果库函数只是这道题中解决问题的一部分,则可以用库函数。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]原创 2024-01-03 21:36:02 · 427 阅读 · 1 评论 -
Leetcoder Day6 | 哈希表part02及总结
今天遇到了三种n数之和的问题,在做题时一定要看好条件,如果不要求含不重复的元组,使用哈希法会很方便;若对元素有要求,尤其是要求不重复时,使用哈希便会很麻烦,可以考虑双指针来解决。原创 2024-01-02 23:06:46 · 1233 阅读 · 1 评论 -
Leetcoder Day5 | 哈希表理论基础 及 Part 1
/创建新的整数集合//在集合里添加元素num_set.contains(i) //判断集合里是否包含某元素=nums_set.end()){}// 判断i的值是否出现在nums_set中,括号里为出现的情况//将集合转换为数组//创建大小为n的数组//创建新的整数列表//在列表中添加元素//创建二维映射<key,value>//判断映射中是否存在key=temp的元素// 获取key=temp元素的value。原创 2024-01-02 19:55:41 · 1093 阅读 · 1 评论 -
Leetcoder Day4|链表part2及总结
语言:Java/C++给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。[2,1,4,3]原创 2023-12-31 03:32:43 · 906 阅读 · 1 评论 -
Leetcoder Day3|链表理论基础|203.移除链表元素 |707.设计链表 |206.反转链表
C++int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x): val(x), next(Null){}// 节点的构造函数//创建链表//链表动态增加元素//定义创建新的元素的辅助指针*pi < n;i++)//开辟了链表的存储空间,不能用delete释放//辅助指针把新创建的节点接到链表的尾巴Javaint val;// 节点的构造函数(无参)// 节点的构造函数(有一个参)// 节点的构造函数(有2个参)Python。原创 2023-12-29 20:18:44 · 1108 阅读 · 0 评论 -
Leetcoder Day2|有序数组的平方|长度最小的子数组 |螺旋矩阵II(数组部分结束)
语言:Java/C++给你一个按排序的整数数组nums,返回组成的新数组,要求也按排序。原创 2023-12-28 21:44:24 · 984 阅读 · 0 评论 -
Leetcoder Day1|数组理论|二分查找|移除元素
语言:Java/C++原创 2023-12-28 01:22:25 · 916 阅读 · 2 评论