随笔分类 - 算法
摘要:为了满足LRU缓存的约束并保证get和put操作的时间复杂度为O(1),我们可以使用哈希表加双向链表的数据结构。哈希表用于快速定位一个节点,双向链表用于维护节点的使用顺序,最近使用的节点被放到链表尾部,最久未使用的节点在链表头部。 146、LRU 以下是一个简单的实现: import java.ut
阅读全文
摘要:61. 旋转链表 错误代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { thi
阅读全文
摘要:82. 删除排序链表中的重复元素 II 是一个有序链表 错误代码 class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode dummy = new ListNode(); dummy.next = head
阅读全文
摘要:LCR 024. 反转链表 1、迭代 这段代码是一个用于反转单链表的Java类。下面是对代码的详细解释: class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; // 初始化前一个节点为n
阅读全文
摘要:19. 删除链表的倒数第 N 个结点 mid(简单) 快慢指针 时间复杂度O(L) 空间复杂度O(1) class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { // 创建一个哑节点,其next指向head,这
阅读全文
摘要:138. 随机链表的复制 递归和哈希表 时间&空间复杂度 O(n) 复杂链表的特点是每个节点除了有一个指向下一个节点的指针外,还有一个随机指针可能指向链表中的任意节点或null。通过递归和哈希表的方式,能够确保每个节点只被复制一次,并且正确地复制了next和random指针。 /* // Defin
阅读全文
摘要:92. 反转链表 II 其中left和right分别表示要反转的部分的起始和结束位置(从1开始计数)。整个过程分为两个主要步骤: 将p0移动到反转部分的前一个节点。 通过循环反转从left到right部分的链表。 最后,通过调整指针,将反转后的部分重新连接到原链表中。 假设我们有一个链表和给定的le
阅读全文
摘要:动态规划的求解过程: (1) 划分子问题:将原问题划分为若干子问题,每个子问题对应一个决策阶段,并子问题之间有重叠关系。 (2) 确定动态规划函数:根据子问题之间重叠关系找到子问题满足的递推关系式。 (3) 填写表格:以自底向上的方式计算各个子问题的解并填表,实现动态规划。 上述过程可求出问题的最优
阅读全文
摘要:经典问题 198打家劫舍 213打家劫舍II 337打家劫舍III 树形dp 279完全平方数 343整数拆分 掌握空间优化写法,知道在一维表格下 01背包逆向、完全背包 正向填表的原因 01背包: 416. 分割等和子集 474. 一和零 494. 目标和 || 笔记 完全背包 322. 零钱兑换
阅读全文