自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MacOS 上安装 JDK 并实现多版本灵活切换

背景:已安装过homebrew、jdk21。

2025-12-27 22:46:43 544

原创 Day42:单调栈part2(42.接雨水、84.柱状图中最大的矩形)

我们不要一下子去算所有的水,试着只关注某一根柱子(比如下标为i的位置)。具体到每一根柱子i,它上面能存多少水,取决于:它左边所有柱子里最高的那个(记为 Lmax)。它右边所有柱子里最高的那个(记为 Rmax)。这两者中较矮的那个决定了水位的高度。在这个基础上,我们需要减去柱子本身的高度,剩下的就是水深。存水量 = min(Lmax, Rmax) - height[i]我们可以构建一个完整的left_max数组。对于每一个位置i就代表了它左边(包括它自己)最高的柱子。

2025-12-17 23:42:24 772

原创 Day41:单调栈part1(739.每日温度、496.下一个更大元素 I、503.下一个更大元素II)

我们可以换一个角度思考:我们维护一个“栈”,用来存储那些还没有找到下一个更高温度的日子的“下标”。栈里的温度通常是递减的(或者相等的)。为什么?因为如果后面出现了一个更高的温度,那么栈顶那些比它低的日子的“等待”就结束了,可以把它们弹出来结算。2. 具体逻辑创建一个结果数组answer,初始化全为 0。创建一个栈stack,用来存数组的索引 (index)。遍历数组,对于每一个当天的温度T[i]如果栈不为空,且 T[i]大于 栈顶索引对应的温度,说明栈顶的那一天终于等到升温了!弹出栈顶索引。

2025-12-17 15:50:30 334

原创 Day40:动态规划part13(647.回文子串、516.最长回文子序列、动态规划总结篇)

这是解决回文串问题最直观、最高效的方法(不需要额外的数组空间)。虽然它看起来和上一道题(回文子串)很像,但有一个巨大的区别,导致了解法逻辑的根本变化。定义dp[i][j]表示:字符串s在区间[i, j]范围内,最长回文子序列的长度。

2025-12-16 14:32:58 600

原创 Day39:动态规划part12(115.不同的子序列、583.两个字符串的删除操作、72.编辑距离)

定义dp[i][j]以s的前i个字符组成的子串中,出现t的前j个字符组成的子串的个数。s的长度为mt的长度为n。dp的大小为。dp[i][j]表示:想要让word1的前i个字符和word2的前j个字符变得相同,所需的最小步数(最小删除次数)。dp[i][j]表示:将word1的前i个字符转换成word2的前j个字符,所需要的最小操作数。

2025-12-15 23:42:16 978

原创 Day38:动态规划part11(1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列)

设dp[i][j]text1的前i个字符 和text2的前j个字符 的最长公共子序列长度。与的 LCS 长度。本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!i <= m;j++) {} else {dp[i]表示以 nums[i] 结尾的连续子数组的最大和。要么从当前元素重新开始(前面的和是负的,不如不要),要么把当前元素加到之前的子数组中(前面的和是正的,值得保留)。最终答案就是所有dp[i]中的最大值。i++) {

2025-12-14 15:50:21 747

原创 Day37:动态规划part10(300.最长递增子序列、674.最长连续递增序列 、718.最长重复子数组)

定义dp[i]表示以nums[i]结尾的最长严格递增子序列的长度。初始时,每个位置至少可以单独构成一个长度为 1 的子序列,所以dp[i] = 1对于每个i,我们遍历所有j < i如果,说明可以把nums[i]接在以nums[j]结尾的递增子序列后面最后答案就是// 每个元素自己就是一个长度为1的子序列i < n;j++) {连续”:意味着子序列在原数组中是相邻的元素,不能跳着选。递增”:严格递增,即,相等不算递增。滑动窗口 / 一次遍历。

2025-12-13 15:49:16 633

原创 Day36:动态规划part9(188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票总结)

本题是动态规划:123.买卖股票的最佳时机III (opens new window)的进阶版,这里要求至多有k次交易。定义两个数组buy和sellbuy[j]:完成j-1次交易后,再买入一次,当前持有股票的最大利润sell[j]:完成j次交易(j次买入和j次卖出)后的最大利润:要么保持之前买入的状态,要么在完成j-1次交易后买入:要么保持之前卖出的状态,要么在第j次买入后卖出buy数组初始化为负无穷(表示初始不可能持有股票)sell数组初始化为0(表示初始没有交易,利润为0)

2025-12-12 18:06:49 628

原创 Day35:动态规划part8(121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III)

状态定义dp[i][0]:表示第 i 天结束时,不持有股票的最大利润。dp[i][1]:表示第 i 天结束时,持有股票的最大利润。注意:我们只能买卖一次,所以“持有股票”最多只能买一次;“不持有”可能是从来没买过,或者买了又卖了。状态定义dp[i][0]:第i天不持有股票时的最大利润;dp[i][1]:第i天持有股票时的最大利润。注意:这里允许多次买卖,所以状态转移会和“只能交易一次”的情况有所不同。我们定义dp[i][j]在第 i 天结束时,处于状态 j的最大利润。其中状态jj含义0。

2025-12-11 16:55:18 756

原创 Day34:动态规划part7(198.打家劫舍、213.打家劫舍II、337.打家劫舍III)

1.确定dp数组(dp table)以及下标的含义dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。2.确定递推公式决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(

2025-12-10 14:09:25 1058

原创 Day33:动态规划part6(322.零钱兑换、279.完全平方数、139.单词拆分、多重背包、背包问题总结)

设dp[i]表示凑成金额i所需的最少硬币数。我们的目标是求dp[amount]。1.确定dp数组(dp table)以及下标的含义dp[j]:和为j的完全平方数的最少数量为dp[j]2.确定递推公式dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);3.dp数组如何初始化。

2025-12-09 16:38:08 897

原创 Day32:动态规划part5(完全背包、518.零钱兑换 II、377.组合总和 Ⅳ、70.爬楼梯 (进阶))

dp[j]:凑成总金额j的货币组合数为dp[j]本题 二维dp 递推公式:这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇494. 目标和 (opens new window)//初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装dp[0] = 1;j++) {本题题目描述说是求组合,但又说是可以元素相同顺序不同的组合算两个组合,其实就是求排列!组合不强调顺序,(1,5)和(5,1)是同一个组合。排列强调顺序,(1,5)和(5,1)是两个不同的排列。

2025-12-08 21:23:47 970

原创 Day31:动态规划part4(1049.最后一块石头的重量 II、494.目标和、474.一和零)

本题其实是尽量让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。一堆的石头重量是sum,那么我们就尽可能拼成 重量为 sum / 2 的石头堆。这样剩下的石头堆也是 尽可能接近 sum/2 的重量。那么此时问题就是有一堆石头,每个石头都有自己的重量,是否可以 装满 最大重量为 sum / 2的背包。dp[target]里是容量为target的背包所能背的最大重量。那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。

2025-12-08 14:19:57 657

原创 Day30:动态规划part3(01背包问题 二维、01背包问题 一维、416.分割等和子集)

01背包中,dp[j] 表示: 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。如果背包所载重量为target, dp[target]就是装满 背包之后的总价值,因为 本题中每一个元素的数值既是重量,也是价值,所以,当 dp[target] == target 的时候,背包就装满了。例:dp[j]的数值一定是小于等于j的。如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和j,理解这一点很重要。

2025-12-06 14:35:00 877

原创 Day29:动态规划part2(62.不同路径、63.不同路径 II、343.整数拆分、96.不同的二叉搜索树)

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]初始化:dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。为什么要对dp[i][0]和dp[0][j]初始化?很简单,因为它们无法通过递推公式求出。i < m;i++)i < n;i++)i < m;i++)j < n;j++)

2025-12-04 23:44:12 714

原创 Day28:动态规划part1(509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯)

动规五部曲:这里我们要用一个一维dp数组来保存递归的结果1.确定dp数组以及下标的含义dp[i]的定义为:第i个数的斐波那契数值是dp[i]2.确定递推公式为什么这是一道非常简单的入门题目呢?因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];3.dp数组如何初始化dp[0] = 0;dp[1] = 1;4.确定遍历顺序从递归公式dp[i] = dp[i - 1] + dp[i - 2];

2025-12-03 13:22:15 598

原创 Day27:贪心算法part5(56.合并区间、738.单调递增的数字、968.监控二叉树)

注意在循环结束后添加上最后一个区间!!!i++) {} else {// 添加最后一个区间题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。flag标记了从哪个位置开始需要将所有数字改为 '9'例如:n = 1000发现 0<0?0<0?0<1?

2025-12-02 22:38:23 921

原创 Day26:贪心算法part4(452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间)

按照起始位置排序,从前向后遍历气球数组,靠左尽可能让气球重复。如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序)可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。// 根据气球直径的开始坐标从小到大排序// 使用Integer内置比较方法,不会溢出// points 不为空至少需要一支箭。

2025-12-01 23:43:41 1090

原创 Day25:贪心算法part3(134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列)

每个加油站的剩余量rest[i]为gas[i] - cost[i]。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。如图:那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了。

2025-11-30 22:50:31 601

原创 Day24:贪心算法part2(122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和)

假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。// 贪心思路。

2025-11-28 18:03:17 830

原创 Day23:贪心算法part1(455.分发饼干、376. 摆动序列、53. 最大子序和)

使用贪心策略,先将饼干数组和小孩数组排序。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。// 思路2:优先考虑胃口,先喂饱大胃口// 遍历胃口index >= 0;count++;遍历数组,记录当前的趋势(上升、下降或平稳)每当趋势发生变化时,说明出现了一个新的峰或谷,摆动序列长度+1忽略平稳的部分(差值为0)

2025-11-25 23:19:41 567

原创 Day22:回溯算法part4(491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独)

在90.子集II (opens new window)中我们是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!// 存放符合条件结果的集合// 用来存放符合条件结果return;// 解法2:通过判断path中是否存在数字,排除已经选择的数字return;i++) {// 如果path中已有,则跳过continue;

2025-11-24 00:06:15 758

原创 Day21:回溯算法part3(93.复原IP地址、78.子集、90.子集II )

主函数:处理边界情况(长度超过12直接返回),初始化回溯过程回溯函数终止条件:已插入3个点号,检查最后一段有效性循环尝试所有可能的分割位置插入点号 → 递归处理下一段 → 回溯删除点号有效性检查检查是否为空子串检查前导零问题检查数字范围是否在0-255内// 存储所有有效的IP地址结果// IP地址最多12个数字(每个段最多3个数字,共4段)// 使用StringBuilder便于插入和删除点号// 从索引0开始,当前点号数量为0return res;/**

2025-11-22 00:02:32 491

原创 Day20:回溯算法part2(39.组合总和、40.组合总和II、131.分割回文串)

对总集合排序之后,如果下一层的sum(就是本层的 sum + candidates[i])已经大于target,就可以结束本轮for循环的遍历。// 剪枝优化// 先进行排序return res;// 找到了数字和为 target 的组合return;i++) {// 如果 sum + candidates[i] > target 就终止遍历// 回溯,移除路径 path 最后一个元素元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。

2025-11-19 16:56:59 478

原创 Day19:回溯算法part1(77. 组合、216.组合总和III、17.电话号码的字母组合)

startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。// 如果当前组合长度等于k,说明找到了一个有效组合// 创建新列表,避免引用问题return;// 从start开始遍历到ni <= n;i++) {// 选择当前数字// 递归处理下一个位置,从i+1开始避免重复// 回溯,撤销选择剪枝优化n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。

2025-11-19 00:08:47 511

原创 Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)

修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。如果root(当前节点)的元素小于low,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high,那么应该递归左子树,并返回左子树符合条件的头结点。接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。最后返回root节点// root在[low,high]范围内如果根据数组构造一棵二叉树。

2025-11-16 23:52:29 639

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

因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。// 递归创建右子树// 递归创建左子树。

2025-11-15 22:31:49 726

原创 Day16:二叉树part6(530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先)

二叉搜索树采用中序遍历,其实就是一个有序数组。在一个有序数组上求两个数最小差值,这是不是就是一道送分题了。// 记录上一个遍历的结点return 0;return;// 左// 中if (pre!// 右currentVal:当前访问的节点值:当前值连续出现的次数maxCount:全局最大出现次数list:存放众数(可能有多个)遍历时:如果节点值等于currentVal否则,重置比较与maxCount。

2025-11-14 15:01:11 1055

原创 Day15:二叉树part5(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树)

和根据后序中序构建二叉树类似i <= end;i++) {// 递归// 如果t1为空,合并之后就应该是t2// 如果t2为空,合并之后就应该是t1// 递归,利用二叉搜索树特点,优化} else {// 迭代,利用二叉搜索树特点,优化,可以不需要栈= null)// 记录中序遍历时的前一个节点// 1. 空树是有效的BST// 2. 递归检查左子树// 3. 检查当前节点:必须大于前一个节点的值if (pre!// 不满足递增顺序。

2025-11-13 00:06:34 374

原创 Day14:二叉树part4(513.找树左下角的值、路径总和、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树)

层序遍历// 记录每层第一个节点的值while (!// 记录当前层第一个节点的值i < len;i++) {递归int res;return res;// 关键修改:只有当深度大于当前最大深度时才更新结果// 这样能保证第一次到达新深度时的节点(即最左边的)被记录// 先左后右,保证同一层中左边的节点先被访问1.递归函数定义:当前节点 node,以及当前还需要满足的剩余和 remain。初始时 remain = targetSum。

2025-11-11 18:24:02 753

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

如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。= -1;/*** 辅助方法:计算树的高度,如果不平衡则返回-1*/// 空节点高度为0return 0;// 递归计算左子树高度// 如果左子树不平衡,直接返回-1return -1;// 递归计算右子树高度// 如果右子树不平衡,直接返回-1return -1;// 检查当前节点是否平衡return -1;

2025-11-09 16:15:25 700

原创 Day12:二叉树part2(226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度)

*** 前后序遍历都可以* 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)*/1.确定递归函数的参数和返回值因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。返回值自然是bool类型。2.确定终止条件要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。

2025-11-07 23:48:26 888

原创 Day11:二叉树part1(递归遍历、迭代遍历、统一迭代、层序遍历)

借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。//BFS--迭代方式--借助队列// 空树直接返回// 创建队列,用于BFS遍历// 根节点入队while (!que.isEmpty()) { // 队列不为空时循环// 创建当前层的节点值列表// 关键:记录当前层的节点数量// 遍历当前层的所有节点// 出队一个节点// 将节点值加入当前层列表// 将左右子节点入队(下一层的节点)

2025-11-06 00:02:22 426

原创 Day10:栈与队列part2(150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素)

遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。if ("+".equals(s)) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等// 注意 - 和/ 需要特殊处理} else {用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可*单调递减队列类似 (head -->) 3 --> 2 --> 1 --> 0 (--> tail) (左边为头结点,元素存的是下标)i < n;

2025-11-02 23:52:36 634

原创 Day9:栈与队列part1(232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项)

/ 负责进栈// 负责出栈// 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中if (!while (!//每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首//将新元素之前的所有元素移到它后面关键点​:遇到左括号时,不存储左括号本身,而是存储对应的右括号。char ch;i++) {// 碰到左括号,就把相应的右括号入栈// 栈为空时遇到右括号或栈顶的右括号与当前右括号不匹配。

2025-10-31 22:12:44 735

原创 Day8:字符串part2(151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串)

移除多余空格将整个字符串反转将每个单词反转// 1.去除首尾以及中间多余空格// 2.反转整个字符串// 3.反转各个单词if (c!return sb;/*** 反转字符串指定区间[start, end]的字符*/start++;end--;start++;end--;

2025-10-30 00:05:38 831

原创 Day7:字符串part1(344.反转字符串、541. 反转字符串II、卡码网:54.替换数字)

定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。int l = 0;s[r] = tmp;l++;r--;每隔2k个反转前k个,尾数不够k个时候全部反转// 判断尾数够不够k个来取决end指针的位置start++;end--;首先扩充数组到每个数字字符替换成 "number" 之后的大小。

2025-10-25 18:37:11 478

原创 Day6:哈希表part2(454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和)

这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!首先定义一个map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计 a+b+c+d = 0 出现的次数。

2025-10-25 00:05:08 976

原创 Day5:哈希表part1(242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和)

数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。首先这个题目的两个注意点:1、结果中的元素一定是唯一的 2、不考虑输出结果的顺序。这种情况下最容易想到的就是Set集合。Set集合的特点就是无序不可重复。所以首先将nums1的所有数字记录到一个set1集合中,此时这个set1集合中是nums1的所有出现过的数字。

2025-10-24 22:14:56 856

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

}*/= null) {双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。定义fast指针和slow指针,初始值为虚拟头结点,如图:fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:i <= n;

2025-10-24 18:57:10 1008

空空如也

空空如也

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

TA关注的人

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