数据结构与算法(二刷)
文章平均质量分 62
这里记录的是每天做题的碎碎念,题解没有一刷详细,如果有小伙伴看可以去看一刷~
QHG7C0
这个作者很懒,什么都没留下…
展开
-
自用leetcode IDEA插件配置
然后temp文件夹保存在/leetcode-java/src(要不重新配置JDK特别麻烦)原创 2024-08-21 19:57:21 · 279 阅读 · 0 评论 -
Day64|代码随想录二刷总结
数组与链表,本科数据结构的常客了,学习的更多是List和数组的区别,怎么更好的操作数组,list转数组,数组转list等;栈与队列,声明优先队列的方法,范型,包装类。哈希表与字符串,学会了java中map和一些字符串函数的用法,题目其实不是很难,以及java怎么更方便的操作字符串,StringBuilder的使用。二叉树部分,之前的递归框架也没忘,能ac的题更加多了,更重要的是学会了调试。原创 2024-05-08 12:53:28 · 569 阅读 · 0 评论 -
Day63|单调栈part02:84.柱状图中最大的矩形
是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。本题和接雨水使用单调栈的解法类似,只不过接雨水找的是。原创 2024-05-07 15:37:27 · 545 阅读 · 0 评论 -
Day62|单调栈part01:503.下一个更大元素II、42. 接雨水
给定一个循环数组nums的下一个元素是nums[0]),返回 nums中每个元素的。也就是说数组是首尾相连的,每次返回的是右边第一个最大元素。原创 2024-05-06 10:57:29 · 503 阅读 · 0 评论 -
Day61|单调栈part01:739. 每日温度、496.下一个更大元素 I
单调栈常常用于解决一类“下一个更大元素”或“下一个更小元素”的问题,例如LeetCode中的739题“每日温度”。。时间复杂度为O(n)。给定一个整数数组,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。这题的意思就是第一天是73,比其更高的74出现在一天之后,故输出1;就是对单调栈基本没了解, 直接看题解。。。原创 2024-05-05 14:43:22 · 654 阅读 · 0 评论 -
Day60|动态规划part17:647. 回文子串、516.最长回文子序列、动态规划总结篇
确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。原创 2024-05-05 14:11:23 · 822 阅读 · 0 评论 -
Day56|动态规划part16:583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇
dp[i][0]:words1[i - 1]和words2[-1](空字符串),全部删除,等于i。主要还是考虑word1[i - 1]和word2[j - 1]的相等情况。相等:dp[i][j] = dp[i - 1][j - 1];从前往后,所以在dp矩阵中一定是从左到右从上到下去遍历。(这里没有添加,因为一个添加就相当于另一个删除)涉及的操作太多了,没啥思路,直接看题解。dp[0][j] 同理为j。原创 2024-04-30 16:35:36 · 353 阅读 · 0 评论 -
Day54|动态规划part15:392.判断子序列、115.不同的子序列
这题我用的方法就是1143找公共子序列的方法,求两者的最大子序列长度,如果与s长度相等)短的那个),就是子序列:O(n*m)也可以用双指针方法:(这个时间复杂度O(n),比较优秀)原创 2024-04-29 16:36:54 · 330 阅读 · 0 评论 -
Day53|动态规划part14: 1143.最长公共子序列、1035. 不相交的线、53. 最大子序和
这题有点像递增子序列和公共子数组的组合, 要求公共子序列不一定非要是连续的。dp[i][j]表示text1[i - 1]与text2[j - 1]结尾的最高公共子序列。长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]最后返回的结果是**dp[text1.length()][text2.length()],**因为这里不相等并不是推倒重新再来,因此遍历到最后一定是最大的。原创 2024-04-27 10:53:04 · 393 阅读 · 0 评论 -
Day52|动态规划part13:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。如果A[i-1] 和B[i - 1]相同,dp[i][j] = dp[i - 1][j - 1] + 1。原创 2024-04-26 15:36:14 · 456 阅读 · 0 评论 -
Day51|动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
【代码】Day51|动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费。原创 2024-04-25 13:43:35 · 311 阅读 · 0 评论 -
Day50|动态规划part11:188.买卖股票的最佳时机IV、123. 买卖股票的最佳时机III
这题限制更多了,改成买卖两次,可以买卖一次也可以买卖两次,选择更多了。有点蒙,直接看题解,dp五部曲。原创 2024-04-24 10:15:58 · 452 阅读 · 0 评论 -
Day49|动态规划part10:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
正统更广泛的解法是动态规划。dp[i][0] 表示第i天持有股票所得最多现金dp[i][1] 表示第i天不持有股票所得最多现金如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;原创 2024-04-23 10:48:24 · 366 阅读 · 0 评论 -
Day48|动态规划part09:198.打家劫舍、213.打家劫舍II、337.打家劫舍III
两种选择,偷这一家或者不偷:还有这种,看看哪个比较好理解:还有将空间复杂度降到常数级:213.打家劫舍II这题增加的条件就是首尾也是相邻的。也就是说第一间屋子和最后一间是相邻的。因此可能存在三种情况(实际上是两种)也就是把上面的rob函数用两次,找到最大值即可:337.打家劫舍III这题的房子又进阶成二叉树了,没啥思路,直接看题解:这道题目算是树形dp的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一原创 2024-04-22 10:44:11 · 978 阅读 · 0 评论 -
Day45|动态规划part07:70. 爬楼梯 (进阶)、322. 零钱兑换、279. 完全平方数
之前已经做过这题了,实际上这题可以抽象成一个(只有两种物品,一个1一个2,但是可以无限取),接下来用动规五部曲重新分析一下。dp[j]表示爬楼梯为j时的爬法。跟之前组合问题总和一样,问的是爬法数量:dp[j] = dp[j - value[i]],其中value={1,2}dp[0] = 1;每一步可以走多次,这是完全背包,内循环需要从前向后遍历。总结:排列先遍历背包,组合先遍历物品。原创 2024-04-21 21:18:08 · 379 阅读 · 0 评论 -
Day44|动态规划part06:完全背包、518. 零钱兑换II、377. 组合总和IV
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。与0-1背包的区别在于每件物品都有无限个;01背包和完全背包唯一不同就是体现在上。原创 2024-04-21 20:49:01 · 294 阅读 · 0 评论 -
Day43|动态规划part05: 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
本题物品的重量为stones[i],物品的价值也为stones[i]。对应着里的物品重量weight[i]和 物品价值value[i]。。01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);既然 dp[j]中的j表示容量,那么最大容量(重量)(也就是target)是多少呢,就是所有石头的重量和。定为target15001即可, 也可以将数组相加再/2在。原创 2024-04-17 11:13:31 · 1093 阅读 · 0 评论 -
Day42|动态规划part04: 01背包问题,你该了解这些!、滚动数组、416. 分割等和子集
其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。原创 2024-04-17 09:47:28 · 1048 阅读 · 0 评论 -
Day41|动态规划part03:343. 整数拆分、96. 不同的二叉搜索树
这两题都是dp数组是一维但打表的时候用到了二维,因此时间复杂度是o(n2),外层循环i用来存结果,j用来穷举优化结果。原创 2024-04-15 09:35:28 · 247 阅读 · 0 评论 -
Day39|动态规划part02:62.不同路径、63. 不同路径II
【代码】Day39|动态规划part02:62.不同路径、63. 不同路径II。原创 2024-04-13 21:55:11 · 214 阅读 · 0 评论 -
Day38|动态规划part01:理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
注意数组越界问题,特殊情况特殊判断;原创 2024-04-12 11:26:49 · 254 阅读 · 0 评论 -
Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结
最近发现总结还有每道题的总结,之后大批量刷的时候根据总结去刷题。原创 2024-04-12 09:51:36 · 526 阅读 · 0 评论 -
Day36|贪心算法part05:435. 无重叠区间、763.划分字母区间、56. 合并区间
(以上就是不重叠区间的用法,用总区间数 - 不重叠区间数就是要删除的区间树)原创 2024-04-11 16:14:55 · 561 阅读 · 0 评论 -
Day35|贪心算法part04:860.柠檬水找零、406. 根据身高重建队列、452. 用最小数量的箭引爆气球
这是一个模拟题,但也有贪心思想:5块更通用,所以20的时候优先用10块。原创 2024-04-09 19:29:28 · 700 阅读 · 0 评论 -
Day34|贪心算法part03:1005.K次取反后最大化的数组和、134. 加油站、135.分发糖果
按照“绝对值”从大到小排序,如果数字小于0将其翻转,最后检查k有没有用完,没用完就反复翻转绝对值最小的数。IntStream.of(nums): 这一步将nums数组转换为一个IntStream流。.boxed(): 这一步将IntStream流转换为Stream流。这是因为IntStream流没有sorted()方法可以接受自定义的比较器,而Stream流可以。原创 2024-04-08 10:33:49 · 443 阅读 · 0 评论 -
Day32|贪心算法part02:122.买卖股票的最佳时机II、55. 跳跃游戏、45. 跳跃游戏II
我发现贪心很多时候是用来解决“差值”的问题,而且题目并不会要求输出具体路径,而往往是求和或者判断是否符合条件。贪心没有套路,贪心能做的DP一定也能做,反之不一定成立。差值问题注意起始和终止两个点的处理。使用贪心算法的实际应用还挺多,比如赫夫曼编码也是一个经典的贪心算法应用。更多时候运用贪心算法可能不是求最优解,而是求次优解以节约时间,比如经典的旅行商问题。原创 2024-04-07 20:54:35 · 564 阅读 · 0 评论 -
Day31|贪心算法part01:理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
记得贪心。原创 2024-04-05 13:30:24 · 689 阅读 · 0 评论 -
Day30|回溯算法part06:332.重新安排行程、51. N皇后、37. 解数独、总结
回溯法一刷算是基本结束了,总结一下。原创 2024-04-04 12:06:21 · 274 阅读 · 0 评论 -
Day29|回溯算法part05:491.递增子序列、46.全排列、 47.全排列 II
leetcode上本题叫做非递减子序列,点名序列存在重复元素的情况。原创 2024-04-03 17:26:12 · 316 阅读 · 0 评论 -
Day28|回溯算法part04:93.复原IP地址、78. 子集、90. 子集II
这就是一个切割问题,跟切割子串类似,但是这题使用.切割。原创 2024-04-03 13:42:23 · 306 阅读 · 0 评论 -
Day27|回溯算法part03:39. 组合总和、40.组合总和II、131.分割回文串
跟III的区别在于候选元素从原来的数字换成具体的数组了,其他的大概逻辑没有变,还有就是startIndex穿进去的时候不用+1(因为可以重复添加自身)原创 2024-04-01 09:29:40 · 506 阅读 · 0 评论 -
Day25|回溯算法part02:216.组合总和III、17.电话号码的字母组合
(注意sum+i的位置)原创 2024-03-30 15:49:00 · 265 阅读 · 0 评论 -
Day24|回溯算法part01:理论基础、77. 组合
回溯算法中函数返回值一般为void。再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。原创 2024-03-29 11:00:04 · 330 阅读 · 0 评论 -
Day23|二叉树part09:669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇
二叉树:是否对称(opens new window)递归:后序,比较的是根节点的左子树与右子树是不是相互翻转迭代:使用队列/栈将两个节点顺序放入容器中进行比较二叉树:求最大深度(opens new window)递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度迭代:层序遍历二叉树:求最小深度(opens new window)递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义迭代:层序遍历二叉树:求有多少个节点(opens new window)原创 2024-03-28 14:30:12 · 591 阅读 · 0 评论 -
Day22|二叉树part08:235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点
首先这题用普通二叉树的解法也是可以ac的,但忽略了二叉搜索树的性质。原创 2024-03-27 10:42:23 · 162 阅读 · 0 评论 -
Day21|二叉树part07:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(这里分两种方法,一种是当作普通的二叉树来做,一种是利用BST的性质来做。原创 2024-03-26 14:15:14 · 306 阅读 · 0 评论 -
Day20|二叉树part06:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
因此如果val大于当前节点的值,就去找当前节点的柚子树,注意有找不到的情况,因此需要判断node==val。终于到二叉搜索树了,其性质决定了有很多围绕有序的考题。(二刷还是掉进了这个陷阱!时间复杂度:O(n)空间复杂度:O(n)原创 2024-03-25 11:27:40 · 307 阅读 · 0 评论 -
Day18|二叉树part05:513.找树左下角的值、112. 路径总和 113.路径总和ii、 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
放*的是重点题目。原创 2024-03-23 22:42:54 · 302 阅读 · 0 评论 -
Day17|二叉树part04:110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、543: 二叉树的直径、124: 二叉树的最大路径和
关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。在二叉树中,n个节点的路径长度是n-1(因为路径长度是由边来定义的,而一个路径上的边总是比节点少1)如果我们选择的终止条件是节点是叶子节点,那么在遍历到叶子节点时,我们还会尝试去遍历它的左子节点和右子节点,这将导致我们尝试去访问 null 节点的左右子节点,从而可能出现空指针异常。原创 2024-03-22 10:26:36 · 676 阅读 · 0 评论 -
Day16|二叉树part03:104. 二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
在最坏的情况下,这个完全二叉树可能会变成一条链,也就是说,每个节点都只有一个子节点。在这种情况下,递归的深度(也就是调用栈的大小)将达到O(log n),其中n是树中的节点数。这个算法的时间复杂度是O(log^2 n)。这是因为在每次递归调用中,我们都在检查左子树和右子树的高度,这需要O(log n)的时间。然后,我们可能需要递归地在左子树或右子树中进行相同的操作,这会再次花费O(log n)的时间。因此,总的时间复杂度是O(log n * log n),也就是O(log^2 n)。原创 2024-03-21 09:35:18 · 260 阅读 · 0 评论