![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java算法打卡
文章平均质量分 68
跟着代码随想录打卡Java算法,2个月过完一轮
吃个球
玻璃清朗,橘子辉煌
展开
-
完结撒花! java算法day60 | 84.柱状图中最大的矩形
【代码】完结撒花!java算法day60 | 84.柱状图中最大的矩形。原创 2024-04-21 22:42:59 · 178 阅读 · 0 评论 -
java算法day59 | 单调栈part02 ● 503.下一个更大元素II ● 42. 接雨水
相比于单纯寻找下一个最大元素,要遍历两边数组,注意i%nums.length。时间复杂度:O(n)空间复杂度:O(n)原创 2024-04-19 23:08:00 · 239 阅读 · 0 评论 -
java算法day58 | 单调栈part01 ● 739. 每日温度 ● 496.下一个更大元素 I
这道题用暴力求解法会超时。那我们就要想如何只遍历一遍就能求解出每个位置的下一个更大值在哪呢。主要的思想就是空间换时间。定义一个单调栈,每次遇到比栈顶元素小的或相等的,直接入栈,遇到比栈顶元素大的,while循环取栈顶元素,给这些位置计算结果。时间复杂度:O(n)空间复杂度:O(n)原创 2024-04-19 22:36:53 · 418 阅读 · 0 评论 -
java算法day57 | 动态规划part17 ● 647. 回文子串 ● 516.最长回文子序列
如果大家做了很多这种子序列相关的题目,在定义dp数组的时候 很自然就会想题目求什么,我们就如何定义dp数组。绝大多数题目确实是这样,不过本题如果我们定义,dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话,我们会发现很难找到递归关系。dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。所以我们要看回文串的性质。原创 2024-04-18 17:29:22 · 800 阅读 · 0 评论 -
java算法day56 | 动态规划part15 ● 392.判断子序列 ● 115.不同的子序列
dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。原创 2024-04-17 00:16:21 · 564 阅读 · 0 评论 -
java算法day55 | 动态规划part16 ● 583. 两个字符串的删除操作 ● 72. 编辑距离
和1143.最长公共子序列这道题思路相同,只不过需要对return的数据做一些操作。时间复杂度:O(nm)空间复杂度:O(nm)原创 2024-04-15 21:21:20 · 297 阅读 · 0 评论 -
java算法day53 | 动态规划part14 ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划
1、dp数组的含义为text1的0到i(不包含i)位置和text2的0到j(不包含j)位置的最长公共子序列的个数。2、递推公式如果text1的i-1位置与text2的j-1位置相等,dp[i][j]=dp[i-1][j-1]+1。如果不相等,则dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])。3、初始化。初始化为最小情况:0。4、遍历循序:从小到大。5、举例推导dp数组时间复杂度:On∗mOn∗m。原创 2024-04-14 21:41:33 · 943 阅读 · 0 评论 -
java算法day52 | 动态规划part13 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组
子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系,那又是什么样的关系呢。注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。On2On。原创 2024-04-13 00:14:48 · 1111 阅读 · 0 评论 -
java算法第51天 | 动态规划part12 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
相比于普通的无限次买卖股票问题,本题只需要在递推公式中考虑如果当天买入股票,那么要保证前一天是冷冻状态(第一次买入除外)。因此只需要在递推公式上做修改。时间复杂度:O(n)空间复杂度:O(n)原创 2024-04-11 20:36:31 · 197 阅读 · 0 评论 -
java算法day50 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV
这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。时间复杂度:O(n)空间复杂度:O(n × 5)原创 2024-04-10 22:41:26 · 292 阅读 · 0 评论 -
java算法day49 | 动态规划part10 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
时间复杂度:O(n)空间复杂度:O(n)原创 2024-04-09 21:26:21 · 248 阅读 · 0 评论 -
java算法day48 | 动态规划part09 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
时间复杂度: O(n)空间复杂度: O(n)原创 2024-04-09 00:19:52 · 337 阅读 · 0 评论 -
java算法day46 | 动态规划part08 ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!
问能否能装满背包(或者最多装多少):对应题目如下:动态规划:416.分割等和子集动态规划:1049.最后一块石头的重量 II问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:动态规划:494.目标和动态规划:518. 零钱兑换 II动态规划:377.组合总和Ⅳ动态规划:70. 爬楼梯进阶版(完全背包)问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);原创 2024-04-07 21:16:07 · 691 阅读 · 0 评论 -
java算法day45 | 动态规划part07 ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数
题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。输入描述:输入共一行,包含两个正整数,分别表示n, m输出描述:输出一个整数,表示爬到楼顶的方法数。输入示例:3 2输出示例:3提示:当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。此时你有三种方法可以爬到楼顶。原创 2024-04-05 10:05:59 · 934 阅读 · 0 评论 -
java算法day44 | 动态规划part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包,完全背包是顺序遍历背包。原创 2024-04-04 23:44:44 · 445 阅读 · 0 评论 -
java算法day43 | 动态规划part05 ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。是不是感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数空间复杂度:O(m)原创 2024-04-04 21:07:25 · 380 阅读 · 0 评论 -
java算法day42 | 动态规划part04 ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
背包问题的分类如下:其中最常考的是01背包和完全背包。掌握这两个基本就可以应付绝大多数背包问题啦。原创 2024-04-02 18:13:36 · 870 阅读 · 0 评论 -
java算法day41 | 动态规划part03 ● 343. 整数拆分 ● 96.不同的二叉搜索树
这道题的递推公式比较难想到,将当前数 i 拆分成两部分,j 和 i-j ,那么dp[i]就的值就是j*(i-j)和 j*dp[i-j]的最大值(j从1到i-1)。时间复杂度:O(n^2)空间复杂度:O(n)原创 2024-04-01 23:15:00 · 437 阅读 · 0 评论 -
java算法day39 | 动态规划part02 ● 62.不同路径 ● 63. 不同路径 II
本题非常巧妙。第一步:定义一个dp数组存储到达每个位置的路径数。第二步:每个位置的路径数=它左面位置的路径数+上面位置的路径数。第三步:不好想的是如何初始化数组。既然只能向下或向右走,可推出最上面一排和最左面一列的所有位置上的路径只有一条。第四步:遍历顺序是从右上角到左下角。第五步:模拟一遍。时间复杂度:O(m × n)空间复杂度:O(m × n)原创 2024-03-30 21:10:13 · 269 阅读 · 0 评论 -
java算法day38 | 动态规划part01 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];dp[i]的定义为:第i个数的斐波那契数值是dp[i]这里我们要用一个一维dp数组来保存递归的结果。思路和上一题很像,但要加上对于情景的联想。为什么这是一道非常简单的入门题目呢?确定dp数组以及下标的含义。原创 2024-03-29 21:14:55 · 793 阅读 · 0 评论 -
java算法day37 | 贪心算法 part06 ● 738.单调递增的数字 ● 968.监控二叉树
从后向前遍历,如果前一个数比后一个数大,则前一个数-1,后面的数都变成9.思路不难,但实现的代码还是有一点繁琐的。以下是用List实现的代码。原创 2024-03-29 00:15:10 · 340 阅读 · 0 评论 -
java算法day36 | 贪心算法 part05 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
重叠区间典型题目,先按照左边界排序,再从左到右判断相邻区间是否重叠,重叠则删除其中一个。时间复杂度:O(nlog n) ,有一个快排空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间。原创 2024-03-27 17:12:16 · 590 阅读 · 0 评论 -
java算法day35 | 贪心算法 part04 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
设定三个变量存储已有的三种面额的数量,只需要设想出每一种情况的找零方案,更新当前每种面额的数量。时间复杂度: O(n)空间复杂度: O(1)原创 2024-03-26 17:43:09 · 340 阅读 · 0 评论 -
java算法第34天 | 贪心算法 part03 ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
先将数组元素从小到大排列,从左向右处理,分两种情况讨论OnlognO1。原创 2024-03-25 17:26:29 · 515 阅读 · 0 评论 -
java算法第32天 | 贪心算法 part02 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
本题中理解利润拆分是关键点!不要整块的去看,而是把整体利润拆为每天的利润。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。,最后稳稳的就是最大利润了。OnO1。原创 2024-03-23 11:26:07 · 1119 阅读 · 0 评论 -
java算法第31天 | 贪心算法 part01 ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
贪心算法没有固定的套路,贪心的本质是贪心算法一般分为如下四步:将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。原创 2024-03-22 23:19:39 · 311 阅读 · 0 评论 -
java算法第30天 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独
今天是三道困难题,一刷可以先跳过。原创 2024-03-21 23:58:18 · 226 阅读 · 0 评论 -
java算法第29天 | * 491.递增子序列 * 46.全排列 * 47.全排列 II
本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。90.子集是可以对数组进行重新排序,再去重。但是这道题是要求子序列,如果对数组重排序会打乱顺序,无法获取子序列。因此491.递增子序列的去重思路是使用HashSet记录当前层处理过的节点,然后遇到已经处理过的节点直接跳过。(注意这里的跳过用的是continue,因为后面的节点还要继续处理)。时间复杂度: O(n * 2^n)空间复杂度: O(n)原创 2024-03-20 23:49:00 · 206 阅读 · 0 评论 -
java算法第28天 | 93.复原IP地址 78.子集 90.子集II
这里startIndex为插入‘.’的位置,使用回溯法遍历所有插入的位置,直接在原始字符串上操作。要注意的是开闭区间的规定(这里我规定的是左闭右闭区间)。还要明确什么时候能return。时间复杂度: O(3^4),IP地址最多包含4个数字,每个数字最多有3种可能的分割方式,则搜索树的最大深度为4,每个节点最多有3个子节点。空间复杂度: O(n)原创 2024-03-19 22:29:28 · 358 阅读 · 0 评论 -
java算法第27天 | ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串
本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制。时间复杂度: O(n * 2^n),注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此空间复杂度: O(target)原创 2024-03-18 23:14:05 · 383 阅读 · 0 评论 -
java算法第25天 | ● 216.组合总和III ● 17.电话号码的字母组合
这两道题都是基于回溯的基本问题。原创 2024-03-16 18:26:41 · 452 阅读 · 0 评论 -
java算法第24天 | 回溯算法理论基础 77. 组合
回溯常用来解决一下问题:回溯算法并不高效,但他可以达到单纯暴力解法达不到的效果。因为当for循环的个数不能固定时,我们可以通过递归来动态实现循环的次数。原创 2024-03-15 21:16:39 · 410 阅读 · 0 评论 -
java算法第23天 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
这道题和删除节点异曲同工。不过要注意避坑:当遍历到不在范围内的节点时,不要直接返回null或直接返回其左或右孩子,而是继续对其左或右孩子做递归。这道题是使用二分查找的思路递归构建二叉树。使用双指针的方法,右中左的顺序遍历数组。原创 2024-03-14 16:08:56 · 370 阅读 · 0 评论 -
java算法第22天 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
可以不考虑题目中提示所说的改变树的结构的插入方式。一定存在一个叶子节点,使val值作为它的左或右孩子是合理的。相对于上一题的插入操作,本题就有难度了,涉及到改树的结构。之前做过普通二叉树求共工作祖先的问题,有两种情况,可以不考虑题目中提示所说的改变树的结构的插入方式。原创 2024-03-13 15:57:21 · 411 阅读 · 0 评论 -
java算法第21天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
使用一个全局的动态数组result来存储当前出现次数最多的数(注意,可能后面还有出现次数更多的数),当遇到出现次数更多的数时,更新result中的数。情况一:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**思路:**用pre节点记录当前节点cur的前一个结点,cur.val-pre.val就是差值。其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。原创 2024-03-12 21:54:44 · 399 阅读 · 0 评论 -
java算法第20天 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
因此使用双指针优化的方法,假设当前遍历的节点是node,定义一个全局变量节点存储node中序遍历的上一个节点。这道题最直观的解法是直接用中序遍历得到一个数组,判断数组是否是由小到大的。和根据后/前中序遍历数组生成树结构的思路一样。首先要明确参数和返回值。同时遍历两个二叉树,可以不创建新的节点,直接在其中一个数的基础上操作。每次递归需要传入数组,和开始和结束的位置,返回的是二叉树的根节点。因为是二叉搜索树,不必左右子树都遍历。但是我试了这种解法超时。原创 2024-03-11 17:35:48 · 344 阅读 · 0 评论 -
java算法第十七天 | ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
注意,这道题的左下角值一定位于最后一层,因此不能单纯地向左下遍历。本题使用层序遍历更加易懂,也可以使用递归方法实现。原创 2024-03-09 23:19:53 · 369 阅读 · 0 评论 -
java算法第十八天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
使用后序遍历分别求左右子树的高度,若高度只差大于一,则返回-1,否则返回当前节点的最大高度。原创 2024-03-09 14:45:49 · 409 阅读 · 0 评论 -
java算法第十六天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。原创 2024-03-07 16:40:20 · 330 阅读 · 0 评论 -
java算法第十五天 | ● 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树
需要借用一个辅助数据结构即来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。不要忽略root为空的情况,否则会报错。原创 2024-03-06 12:17:38 · 883 阅读 · 0 评论