10 2025 档案
摘要:1. 两数之和 暴力法 思路 两层for循环,外层for循环i遍历数组元素,内层for循环j遍历[i+1, n-1]范围内剩余元素,若nums[i]+nums[j] = target,返回[i,j]。 哈希表(map) 思路 一层for循环i遍历数组元素,判断当前元素nums[i]的另一半(targ
阅读全文
摘要:202. 快乐数 哈希表(set) 思路 将每次循环计算得到的数加入哈希表(set) set1 中,加入前判断这个数是否已存在于 set1 中, 若存在,说明出现了循环,不是快乐数,返回 false; 若不存在,将计算得到的数加入哈希表(set) set1 中。 当计算得到的数等于1时,说明是快乐数
阅读全文
摘要:349. 两个数组的交集 哈希表(set) 思路 进阶 何时用哈希表? (1)判断一个元素是否在一个集合中。(2)判断一个元素是否在一个集合中出现过。 用哈希表的哪一种数据结构(数组、set、map)? 数组、set、map的区别? import java.util.Set; import java
阅读全文
摘要:242. 有效的字母异位词 哈希表 思路 哈希表record[26]用于统计串 s 中字母的出现次数,哈希函数:s.charAt(i) - 'a' 将串 s 中的字母映射到[0,25]哈希表下标。 然后遍历串 t,减去record[26]中对应字母的次数。 若record[26]中元素均为0,则两串
阅读全文
摘要:
阅读全文
摘要:面试题 02.07. 链表相交 双指针 思路 a 指针先遍历A再遍历B, b 指针先遍历B再遍历A,a == b 时退出循环。 若A与B没有交点,a = b = null;若A与B有交点,则a 与 b均均指向第一个相交的结点。 心得 得出初步思路后,先在case上验证,再动手写代码。否则思路没考虑全
阅读全文
摘要:19. 删除链表的倒数第 N 个结点 快慢指针 思路 快指针先走N步,然后快慢指针以相同速度向右遍历链表,当快指针指向最后一个结点时,慢指针指向倒数第N个结点的前驱结点。 补充 涉及到链表的插入与删除操作增加一个虚拟头结点准没错! class Solution { public ListNode r
阅读全文
摘要:24. 两两交换链表中的节点 #### 双指针 思路 指针pre、cur遍历链表,每次循环分别指向两个相邻的结点。指针link、tmp辅助实现两两交换。每次交换指针操作次数过多,较复杂,画图避免出错。 class Solution { public ListNode swapPairs(ListNo
阅读全文
摘要:206.反转链表 双指针 class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; ListNode tmp = null; while (cur !
阅读全文
摘要:707. 设计链表 思路 使用带虚拟头结点的单链表,简化插入和删除操作。 // 单链表 class MyLinkedList { // 链表结点 class ListNode { int val; ListNode next; ListNode(int val) { this.val = val;
阅读全文
摘要:203. 移除链表元素 删除链表结点 方式1:直接在原链表删除 方式2:添加一个虚拟头结点,再删除 删除链表结点操作是通过前一个结点完成的,由于头结点没有前驱结点,所以头结点的删除需要单独的处理逻辑。 通过添加一个虚拟头结点,链表中所有结点的删除操作相同。 方式1 class Solution {
阅读全文
摘要:44. 开发商购买土地 前缀和 思路 可能的情况有两类,A占前 i 行,B占剩余行;A占前 j 列,B占剩余列。 若直接暴力枚举,第一层 for 循环遍历行(控制行的切分),第二层、第三层 for 循环计算A区域中元素和,时间复杂度O(n^3)。 1、计算每行的和,得到行前缀和数组horizonto
阅读全文
摘要:58. 区间和(第九期模拟笔试) 前缀和 思路 前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。 适用场景:前缀和在涉及计算区间和的问题时非常有用! import java.util.Scanner; public class Main { public static
阅读全文
摘要:59. 螺旋矩阵 II 思路 用代码模拟出顺时针填充数字的过程。 每填充一圈涉及4条边:顶部、右列、底部、左列。 对每条边的处理保持一致,每条边均采用左闭右开统一处理,避免出现混乱,即循环不变量原则。 不变量:坚持相同的原则。在本题中就是坚持每条边左闭右开的原则,最右侧元素留作下一条边的起始元素进行
阅读全文
摘要:209. 长度最小的子数组 滑动窗口 思路 初始化滑动窗口的起始位置 left = 0、终止位置 right = 0。 外循环先确定滑动窗口的终止位置(增大滑动窗口),找到符合条件的子序列, 根据当前子序列元素和大小的情况,在内循环中移动滑动窗口的起始位置(缩小滑动窗口),找到长度更小的且符合条件的
阅读全文
摘要:977. 有序数组的平方 相向双指针 思路 nums数组非递减,平方后最大值一定在待排序区间的最两端(最左端 left 或最右端 right),每次循环取最大值添加到res数组中, 更新对应的边界缩小区间,重复上述过程直至 left > right。 class Solution { public
阅读全文
摘要:977. 有序数组的平方 不停地根据错误用例给代码打补丁,最后还是会有新的错误用例,永远补不好。 下面展示一下耗时1小时产出的💩 class Solution { public int[] sortedSquares(int[] nums) { // 统计nums数组中非正数的个数 int cou
阅读全文
摘要:27. 移除元素 1、暴力 解题过程 外层循环遍历nums数组,当遇到等于val的元素时,进入内层循环将后续元素均前移一位,覆盖前一个元素。 时间复杂度: O(n^2) 空间复杂度: O(1) class Solution { public int removeElement(int[] nums,
阅读全文
摘要:简洁 Java中的二维数组是数组的数组 int[][] rating = new int[3][4]; 行内元素在内存中连续存储,行之间的元素不连续。 rating[0]、rating[1]、rating[2]分别指向一个一维数组 详细 进阶 **交错数组 ** // 只指定行数,不指定列数 int
阅读全文