- 博客(29)
- 收藏
- 关注
原创 13.3三数之和
外层循环固定第一个数 `nums[i]`,并跳过重复值(`nums[i] == nums[i-1]`),同时若 `nums[i] > 0` 直接终止(因后续数更大,无法求和为 0)。内层使用双指针 `left` 和 `right` 在剩余区间寻找两数之和等于 `-nums[i]`:若和等于目标,记录结果并跳过重复值;若和较小则右移 `left`,否则左移 `right`。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。唯一可能的三元组和为 0。
2025-03-28 22:02:07
174
原创 Z字形变换
维护一个动态窗口 `[flag, i]`,其中 `flag` 是窗口左边界,`i` 是右边界,并用 `HashMap` 记录字符的最新位置。遍历字符串时,如果当前字符 `c` 已存在且位于窗口内(`map.get(c) >= flag`),则更新窗口左边界为 `map.get(c) + 1`,并计算当前窗口长度 `i - flag` 来更新最大值 `max`。最后返回 `max` 和最后一个窗口长度的较大值,确保覆盖边界情况。,以从上往下、从左到右进行 Z 字形排列。
2025-03-28 21:59:08
251
原创 无重复字符的最长子串
使用滑动窗口和哈希表来找出字符串中最长无重复字符的子串长度。维护一个滑动窗口 `[flag, i]`,其中 `flag` 是窗口的左边界,`i` 是右边界。哈希表 `map` 记录每个字符最近出现的位置。遍历字符串时,如果当前字符 `c` 已经在 `map` 中存在且其位置在窗口内(`>= flag`),则更新窗口左边界为 `map.get(c) + 1`,并计算当前窗口长度 `i - flag`,更新最大值 `max`。最后返回 `max` 和最后一个窗口长度的较大值,确保覆盖整个字符串的情况。
2025-03-28 21:54:53
300
原创 12.3不同路径 II
1. 向右 -> 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右 -> 向右。,表示从左方和上方到达当前点的路径数之和。机器人每次只能向下或者向右移动一步。返回机器人能够到达右下角的不同路径数量。机器人的移动路径中不能包含。3x3 网格的正中间有一个障碍物。网格中的障碍物和空位置分别用。即为从起点到终点的总路径数。测试用例保证答案小于等于。从左上角到右下角一共有。,表示起点路径数为 1。存储当前行的路径数,如果当前格子是障碍物,
2025-03-16 21:55:43
301
原创 12.2 不同路径
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。网格的左上角 (起始点在下图中标记为 “Start” )。从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下。2. 向下 -> 向下 -> 向右。3. 向下 -> 向右 -> 向下。),机器人只能一直向右走,因此。),机器人只能一直向下走,因此。即为从起点到终点的总路径数量。问总共有多少条不同的路径?
2025-03-16 21:53:29
329
原创 12.1字符串相乘
不能使用任何内置的 BigInteger 库或直接将输入转换为整数。数组,处理每一位的进位,确保每一位的值都在 0 到 9 之间。:从最高位开始,跳过前导零,找到第一个非零的位置。数组中的有效数字逆序拼接成最终的结果字符串。的乘积,它们的乘积也表示为字符串形式。,并逆序存储(即最低位在数组的最前面)。中的每一位相乘,结果累加到结果数组。给定两个以字符串形式表示的非负整数。:将输入的两个字符串。
2025-03-16 21:51:46
295
原创 11.2在排序数组中查找元素的第一个和最后一个位置
lower_bound` 方法在数组中查找第一个大于等于目标值的元素索引,`searchRange` 先调用 `lower_bound` 找到 `target` 首次出现位置,若未找到则返回 `[-1, -1]`,接着调用 `lower_bound` 查找 `target + 1` 首次出现位置并减 1 得到 `target` 最后一次出现位置,最终返回包含这两个位置的数组。请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。
2025-03-02 20:51:45
320
原创 11.1整数转罗马数字
该 `Solution` 类实现了将整数转换为罗马数字的功能。类中定义了一个二维字符串数组 `R`,分别存储了个位、十位、百位、千位上各个数字对应的罗马数字表示。`intToRoman` 方法接收一个整数 `num`,通过对 `num` 进行除法和取模运算,分别提取出其千位、百位、十位和个位上的数字,然后从 `R` 数组中获取对应位置的罗马数字字符串,最后将这些字符串拼接起来并返回。罗马数字是通过添加从最高到最低的小数位值的转换而形成的。给定一个整数,将其转换为罗马数字。
2025-03-02 20:51:38
242
原创 11.3打家劫舍
数组记录偷到前两间房的最大金额,再从第 2 间房开始遍历,通过比较不偷当前房(即偷到上一间房的最大金额)和偷当前房(偷到上两间房的最大金额加当前房金额)两种情况的最大值更新。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 2 + 9 + 1 = 12。
2025-03-02 20:38:41
180
原创 10.1对称二叉树
方法用于递归地检查两棵子树是否对称。类包含了检查二叉树是否对称的方法。是主方法,它调用了辅助方法。来判断左右子树是否对称。给你一个二叉树的根节点。, 检查它是否轴对称。
2024-12-08 22:09:12
338
原创 9.1 二叉树的中序遍历
(Depth First Search,深度优先搜索)是一个辅助方法,采用的是递归策略。首先检查当前节点是否为空,如果为空则直接返回;否则,先对左子树进行递归遍历,然后将当前节点的值(方法的主要作用是递归地按照"左-根-右"的顺序遍历整棵树,并将访问到的节点值添加到。递归算法很简单,你可以通过迭代算法完成吗?)时,函数会返回,终止当前路径的遍历。给定一个二叉树的根节点。的公共方法,它接收一个。,表示二叉树的根节点。中,最后再遍历右子树。
2024-12-01 22:31:04
289
原创 9.2相同的树
因为两个树不可能相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。都不为空,就比较它们的节点值,如果节点值不同,那么立即返回。是否都为空,如果是,则两个空树被认为是相同的,所以返回。如果任何时候发现不匹配,就会提前结束递归并返回。最后,整个树结构相同的前提是左右子树都相等,因此返回。方法采用了递归的方式来实现判断。,编写一个函数来检验这两棵树是否相同。给你两棵二叉树的根节点。
2024-12-01 22:31:02
272
原创 8.2合并两个有序数组
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。最终,合并后数组不应由函数返回,而是存储在数组。需要合并 [1,2,3] 和 [2,5,6]。需要合并的数组是 [] 和 [1]。的方法,用于合并两个已排序整数数组。函数),使得合并后的数组按升序排列。需要合并 [1] 和 []。中,使合并后的数组同样按。合并结果是 [1]。合并结果是 [1]。
2024-11-25 18:46:39
445
原创 7.2加一
你可以假设除了整数 0 之外,这个整数不会以零开头。最高位数字存放在数组的首位, 数组中每个元素只存储。数组所表示的非负整数,在该数的基础上加一。加 1 得到了 9 + 1 = 10。因此,结果应该是 [1,0]。输入数组表示数字 4321。输入数组表示数字 123。输入数组表示数字 9。
2024-11-17 15:52:57
385
原创 6.2买卖股票的最佳时机
在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。在这种情况下, 没有交易完成, 所以最大利润为 0。买入这只股票,并选择在。
2024-11-10 20:38:18
248
原创 6.1 爬楼梯
你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。
2024-11-10 20:38:14
204
原创 5.1有效括号
如果长度为 0,说明所有的括号都已配对成功,原始字符串表示的是有效的括号序列;否则,表示还有未配对的括号,返回 false。因为有效括号序列总是成对出现(如 ‘(’ 对应 ‘)’,‘{’ 对应 ‘}’),所以只需要检查一半的字符即可。方法移除当前字符位置处的所有括号配对,例如如果当前位置是 ‘(’, 就会移除其后的 ‘)’。使用一个 for 循环,遍历从 0 到。的长度,并将长度除以 2 得到。当循环结束后,检查更新后的字符串。的范围,对于每次循环,使用。,判断字符串是否有效。
2024-10-20 21:11:16
250
1
原创 5.2合并两个有序列表
首先创建一个虚拟头节点和一个指针,它们都指向起点,因为我们需要一个起点来方便处理结果链表。新链表是通过拼接给定的两个链表的所有节点组成的。当其中一个链表遍历完后,将另一个剩余的链表接到结果链表的末尾。最后返回,即合并后的有序链表的头部。将两个升序链表合并为一个新的。循环遍历两个输入链表。,直到其中一个链表结束。
2024-10-20 21:11:12
255
原创 4.2回文数
从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。是指正序(从左向右)和倒序(从右向左)读都是一样的整数。从右向左读, 为 01。因此它不是一个回文数。除以10更新其本身的值,移除最低位。变为0时,表示所有位已处理完毕,此时。对10取余的结果,这一步相当于取出。用于存储反转后的值,初始化为0;是一个回文整数,返回。的当前最低位并添加到。,如果它们相等,说明。
2024-10-13 19:56:53
364
原创 4.1两数之和
如果存在,说明已经找到了一对数(当前元素和差值对应的元素),将它们的索引赋值给。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。2. 如果不存在,将当前元素的值(整数,并返回它们的数组下标。中的元素,对于每一个元素。你可以按任意顺序返回答案。,请你在该数组中找出。
2024-10-13 19:56:50
384
原创 3.2移除元素
/ 它以不等于 val 的值排序。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。// 长度正确的预期答案。// 排序 nums 的前 k 个元素。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你的函数函数应该返回 k = 2, 并且 nums。如果所有的断言都通过,你的解决方案将会。的元素都已处理,这时返回计数器。的元素,跳过它,继续移动。中的前两个元素均为 2。
2024-08-10 17:30:53
666
原创 3.1找出字符串中第一个匹配项的下标
"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。方法以及循环来实现这个功能 ,这里我选前者。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。
2024-08-10 17:25:32
540
原创 2.2搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-08-03 17:44:13
254
原创 2.1最后一个单词的长度
的最后一个单词,就是从字符串的结尾开始,直到遇到空格为止。,由若干单词组成,单词前后用一些空格字符隔开。是指仅由字母组成、不包含任何空格字符的最大子字符串。为0,当遇到非字母字符或者遍历到开头时,停止并返回。最后一个单词是长度为 6 的“joyboy”。最后一个单词是“World”,长度为 5。最后一个单词是“moon”,长度为 4。
2024-08-03 17:34:55
632
原创 1.1计数器
在 JavaScript 中,函数对作用域中变量进行应用,其作用域被称为语法环境,函数与其环境的组合被称为闭包,与类不同之处在于闭包允许真正封装(不使用前缀语法)counter() = 10 // 第一次调用 counter(),返回 n。counter() 最初返回 -2。然后在每个后续调用后增加 1。counter() = 11 // 返回上次调用的值加 1。counter() = 12 // 返回上次调用的值加 1。,每次调用它时会返回前一个值加 1 的值 (,请你编写并返回一个。
2024-07-28 17:24:02
315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅