随笔分类 -  算法

摘要:什么是懒删除? 在Dijkstra算法中,同一个节点可能被多次加入优先队列,但只有最短的那次才是有效的。懒删除就是"推迟删除",直到真正从队列中取出时再判断是否有效。 举个例子理解 假设有这样一个图: A --2--> B A --5--> C B --1--> C 执行过程: 初始: dist[A 阅读全文
posted @ 2025-12-09 19:41 Nickey103 阅读(7) 评论(0) 推荐(0)
摘要:如果输入数据总量 ≥ 10^5,则应该考虑使用快读。 尤其是:总整数个数 ≥ 100000,或输入文件大小 ≥ 几 MB 且语言是 Java,因为 Java 的 Scanner 会非常慢,本质上是“正则解析器”,时间复杂度远高于预期。 static class FastScanner { priva 阅读全文
posted @ 2025-12-06 00:39 Nickey103 阅读(8) 评论(0) 推荐(0)
摘要:下面给出动态规划(DP)中最经典的问题类型与对应的典型状态定义(State Definition)大全,按主题系统归纳,方便学习与复习。每类均附带问题特征、常用状态表示、典型转移。 一、序列型 DP(Sequence DP) 1. 最长上升子序列(LIS) 状态定义: ( dp[i] ):以第 (i 阅读全文
posted @ 2025-11-24 19:00 Nickey103 阅读(8) 评论(0) 推荐(0)
摘要:下面给出一套体系化、可复用、适用于所有 DP(尤其是复杂 DP)的问题解法框架。 内容分为两部分: 如何确定 dp 数组的定义(状态定义) 如何推导状态转移方程(状态转移) ① 如何确定 DP 数组的定义?(状态定义的三原则) DP 的本质是: 定义一个状态,使其可以准确、唯一描述问题的“子问题”, 阅读全文
posted @ 2025-11-24 18:57 Nickey103 阅读(33) 评论(0) 推荐(0)
摘要:188. 买卖股票的最佳时机 IV 如何推导状态转移方程? 当前层的每一个状态来自上一层的哪些状态? 若状态转移方程中出现复杂计算,改变dp数组的定义或增加dp数组的维度。 class Solution { public int maxProfit(int k, int[] prices) { if 阅读全文
posted @ 2025-11-24 18:33 Nickey103 阅读(24) 评论(0) 推荐(0)
摘要:在力扣算法题中,Java对数组的常见操作及其复杂度: 1. 排序操作 Arrays.sort(nums); // 时间复杂度: O(nlogn) Arrays.sort(nums, 1, 4); // 时间复杂度: O(klogk), k为排序范围大小 // 自定义排序(需要转为Integer[]) 阅读全文
posted @ 2025-11-24 10:00 Nickey103 阅读(7) 评论(0) 推荐(0)
摘要:递归算法复杂度分析 递归是算法设计中的重要技术,能将复杂问题分解为相似子问题。然而,递归算法的性能分析往往比迭代算法复杂。本文系统介绍递归算法时间与空间复杂度的分析方法,并通过实例帮助你掌握这一关键技能。 一、理解递归算法的基本结构 递归算法通过函数调用自身解决问题,包含两个核心部分: 基本情况:递 阅读全文
posted @ 2025-11-24 09:56 Nickey103 阅读(45) 评论(0) 推荐(0)
摘要:时间复杂度 = 递归次数 * 每次递归的操作次数 空间复杂度 = 递归深度 * 每次递归消耗的空间数 例子 求斐波那契数列 int fibonacci(int i) { if(i <= 0) return 0; if(i == 1) return 1; return fibonacci(i-1) + 阅读全文
posted @ 2025-11-17 13:31 Nickey103 阅读(10) 评论(0) 推荐(0)
摘要:1. 两数之和 暴力法 思路 两层for循环,外层for循环i遍历数组元素,内层for循环j遍历[i+1, n-1]范围内剩余元素,若nums[i]+nums[j] = target,返回[i,j]。 哈希表(map) 思路 一层for循环i遍历数组元素,判断当前元素nums[i]的另一半(targ 阅读全文
posted @ 2025-10-18 20:43 Nickey103 阅读(9) 评论(0) 推荐(0)
摘要:202. 快乐数 哈希表(set) 思路 将每次循环计算得到的数加入哈希表(set) set1 中,加入前判断这个数是否已存在于 set1 中, 若存在,说明出现了循环,不是快乐数,返回 false; 若不存在,将计算得到的数加入哈希表(set) set1 中。 当计算得到的数等于1时,说明是快乐数 阅读全文
posted @ 2025-10-18 14:53 Nickey103 阅读(9) 评论(0) 推荐(0)
摘要:349. 两个数组的交集 哈希表(set) 思路 进阶 何时用哈希表? (1)判断一个元素是否在一个集合中。(2)判断一个元素是否在一个集合中出现过。 用哈希表的哪一种数据结构(数组、set、map)? 数组、set、map的区别? import java.util.Set; import java 阅读全文
posted @ 2025-10-18 14:21 Nickey103 阅读(6) 评论(0) 推荐(0)
摘要:242. 有效的字母异位词 哈希表 思路 哈希表record[26]用于统计串 s 中字母的出现次数,哈希函数:s.charAt(i) - 'a' 将串 s 中的字母映射到[0,25]哈希表下标。 然后遍历串 t,减去record[26]中对应字母的次数。 若record[26]中元素均为0,则两串 阅读全文
posted @ 2025-10-18 13:37 Nickey103 阅读(10) 评论(0) 推荐(0)
摘要:面试题 02.07. 链表相交 双指针 思路 a 指针先遍历A再遍历B, b 指针先遍历B再遍历A,a == b 时退出循环。 若A与B没有交点,a = b = null;若A与B有交点,则a 与 b均均指向第一个相交的结点。 心得 得出初步思路后,先在case上验证,再动手写代码。否则思路没考虑全 阅读全文
posted @ 2025-10-17 23:19 Nickey103 阅读(10) 评论(0) 推荐(0)
摘要:19. 删除链表的倒数第 N 个结点 快慢指针 思路 快指针先走N步,然后快慢指针以相同速度向右遍历链表,当快指针指向最后一个结点时,慢指针指向倒数第N个结点的前驱结点。 补充 涉及到链表的插入与删除操作增加一个虚拟头结点准没错! class Solution { public ListNode r 阅读全文
posted @ 2025-10-17 21:50 Nickey103 阅读(9) 评论(0) 推荐(0)
摘要:24. 两两交换链表中的节点 #### 双指针 思路 指针pre、cur遍历链表,每次循环分别指向两个相邻的结点。指针link、tmp辅助实现两两交换。每次交换指针操作次数过多,较复杂,画图避免出错。 class Solution { public ListNode swapPairs(ListNo 阅读全文
posted @ 2025-10-17 20:16 Nickey103 阅读(15) 评论(0) 推荐(0)
摘要:206.反转链表 双指针 class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; ListNode tmp = null; while (cur ! 阅读全文
posted @ 2025-10-17 15:49 Nickey103 阅读(9) 评论(0) 推荐(0)
摘要:707. 设计链表 思路 使用带虚拟头结点的单链表,简化插入和删除操作。 // 单链表 class MyLinkedList { // 链表结点 class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; 阅读全文
posted @ 2025-10-17 15:24 Nickey103 阅读(7) 评论(0) 推荐(0)
摘要:203. 移除链表元素 删除链表结点 方式1:直接在原链表删除 方式2:添加一个虚拟头结点,再删除 删除链表结点操作是通过前一个结点完成的,由于头结点没有前驱结点,所以头结点的删除需要单独的处理逻辑。 通过添加一个虚拟头结点,链表中所有结点的删除操作相同。 方式1 class Solution { 阅读全文
posted @ 2025-10-17 12:13 Nickey103 阅读(11) 评论(0) 推荐(0)
摘要:44. 开发商购买土地 前缀和 思路 可能的情况有两类,A占前 i 行,B占剩余行;A占前 j 列,B占剩余列。 若直接暴力枚举,第一层 for 循环遍历行(控制行的切分),第二层、第三层 for 循环计算A区域中元素和,时间复杂度O(n^3)。 1、计算每行的和,得到行前缀和数组horizonto 阅读全文
posted @ 2025-10-13 18:06 Nickey103 阅读(12) 评论(0) 推荐(0)
摘要:58. 区间和(第九期模拟笔试) 前缀和 思路 前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。 适用场景:前缀和在涉及计算区间和的问题时非常有用! import java.util.Scanner; public class Main { public static 阅读全文
posted @ 2025-10-13 17:12 Nickey103 阅读(12) 评论(0) 推荐(0)