当前位置: 首页 > news >正文

算法日记 - Day9

排序链表


这里说要使用O ( n log ⁡ n ) O(n \log n)O(nlogn)的时间复杂度,其实很容易想到需要使用排序,因为我们既要保证最终的升序顺序,又不能超过O ( n 2 ) O(n^2)O(n2)的时间复杂度,所以这里借助归并排序,我们使用迭代的方法自下而上,不使用递归自上而下,因为它的空间复杂度不是常数级

思想是什么呢?

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */classSolution{publicListNodesortList(ListNodehead){if(head==null)returnhead;intlength=getLength(head);ListNodedummy=newListNode(0,head);// 哨兵节点for(intstep=1;step<length;step*=2){// 归并排序次数ListNodepreListTail=dummy;// 前一个已经排好序的尾节点ListNodecur=dummy.next;while(cur!=null){// 拆分,相当于 2->1->3 拆分为了 2, 1, 3ListNodehead1=cur;ListNodehead2=splitList(head1,step);cur=splitList(head2,step);// 下一组需要排序的// 归并,2, 1, 3 变为 1->2, 3ListNode[]headTail=merge(head1,head2);// 一次归并排序,返回头节点尾节点// 变为 1->2->3preListTail.next=headTail[0];preListTail=headTail[1];}}returndummy.next;}ListNodesplitList(ListNodehead,intsize){ListNodecur=head;for(inti=0;i<size-1&&cur!=null;i++){cur=cur.next;}if(cur==null||cur.next==null){returnnull;}ListNodenxt=cur.next;cur.next=null;returnnxt;}intgetLength(ListNodehead){intlength=0;while(head!=null){length++;head=head.next;}returnlength;}ListNode[]merge(ListNodehead1,ListNodehead2){ListNodedummy=newListNode();ListNodecur=dummy;while(head1!=null&&head2!=null){if(head1.val<head2.val){cur.next=newListNode(head1.val);head1=head1.next;}else{cur.next=newListNode(head2.val);head2=head2.next;}cur=cur.next;}cur.next=head1==null?head2:head1;while(cur.next!=null){cur=cur.next;}returnnewListNode[]{dummy.next,cur};}}

LRU缓存

第一种方式,也就是直接利用 Java 的库,双向链表LinkedHashMap,它非常适合用来实现 LRU,它是一个双向链表,并且在构造方法中指定accessOrder为 true 的话,会在访问元素的时候把元素移动到链表尾部,这样链表首元素就是最近最少被访问的元素,它还提供一个方法removeEldestEntry,它会返回一个返回值,告诉LinkedHashMap是否需要移除链表首元素。

classLRUCacheextendsLinkedHashMap<Integer,Integer>{privatefinalintcapacity;publicLRUCache(intcapacity){super(capacity,0.75f,true);// 第二个参数用默认值 0.75f 就行,第三个即 accessOrderthis.capacity=capacity;}publicintget(intkey){returnsuper.getOrDefault(key,-1);}@OverrideprotectedbooleanremoveEldestEntry(Map.Entry<Integer,Integer>eldest){returnsize()>capacity;}}

也可以我们自己手写 LRU,利用 HashMap + 循环链表,也就是仿照LinkedHashMap的实现。这里我们链表末尾表示最近最少访问的

classLRUCache{// 节点staticclassNode{intkey,val;Nodepre,next;Node(intkey,intval){this.key=key;this.val=val;}}privatefinalMap<Integer,Node>keyToNode=newHashMap<>();privatefinalintcapacity;privatefinalNodedummy=newNode(0,0);// 哨兵节点publicLRUCache(intcapacity){this.capacity=capacity;dummy.pre=dummy;dummy.next=dummy;// 自己指向自己}publicintget(intkey){if(!keyToNode.containsKey(key)){return-1;}Nodex=keyToNode.get(key);remove(x);// 放到链表表头pushFront(x);returnx.val;}privatevoidremove(Nodex){x.pre.next=x.next;x.next.pre=x.pre;}publicvoidput(intkey,intvalue){// 已经包含,则更新值并放入尾部if(keyToNode.containsKey(key)){Nodecur=keyToNode.get(key);cur.val=value;remove(cur);pushFront(cur);}else{// 未包含则放入头部NodenewNode=newNode(key,value);pushFront(newNode);keyToNode.put(key,newNode);if(keyToNode.size()>capacity){// 大于容量之后需要移除头节点keyToNode.remove(dummy.pre.key);remove(dummy.pre);}}}privatevoidpushFront(Nodenode){node.next=dummy.next;node.pre=dummy;dummy.next.pre=node;dummy.next=node;}}
http://www.jsqmd.com/news/1341025/

相关文章:

  • 本地部署多语言大模型:从环境配置到生产服务的完整工程指南
  • 2026江西想学电脑技术拿文凭?电大中专计算机应用怎么报名?联系方式多少? - 最新资讯
  • 2026年WhatsApp外贸群发正规服务商选型指南:合规避坑实操与API工具差异化区分参考 跨境魔方选型参考 - 商业大观
  • Word页眉横线去除全攻略:从原理到实践的4种高效方法
  • BeanUtil.copyProperties(weighBillRecord, existRecord, CopyOptions.create().setIgnoreNullValue(true))
  • 编译原理核心考点精讲:从正则表达式到代码优化的完整知识体系
  • 2026宿州想学电脑技术拿文凭?电大中专计算机应用怎么报名?联系方式多少? - 最新资讯
  • 前端转大模型:Demo能跑通就够了吗?权限日志才是真门槛
  • 代码之外01:如果能重来,我不会再做那个只会埋头写代码的人
  • 无需代码!用WorkBuddy为Obsidian知识库添加AI智能管理
  • AI模型对比评测:超越输赢的Prompt工程实战指南
  • Move Mouse终极指南:Windows防休眠神器完全配置手册
  • 洛阳家宴餐厅怎么选?别只看菜品,先看包间、流程和宴席对接标准 - 中国华商产业观察网
  • PyTorch CUDA GPU加速:从环境配置到性能优化的完整指南
  • 为什么工人报工老不准
  • 2026年外贸WhatsApp群发工具避坑指南 甄别正规服务商与违规脚本 解读封号诱因及触发机制 附跨境魔方选型参考 - 产业观察报
  • Nature Skills 源码解析与知识图谱集成实战:9大架构规律与改造方案
  • 一站式全流程外贸实战培训机构甄选2026:北京势能象限咨询有限公司(附电话) - damaigeo
  • 贵阳全屋舒适系统怎么选?从地暖、中央空调到新风净水,看清施工流程、价格差异和避坑细节 - 中国华商产业观察网
  • JDK 15核心特性解析:密封类、ZGC与文本块实战指南
  • 终极指南:如何使用SMUDebugTool免费掌控你的AMD Ryzen处理器性能
  • 软件测试面试全攻略:从基础理论到实战技巧
  • Agentic BI云平台推荐,哪些方案能让业务人员自然语言查数并分析原因?
  • UE5动态加载DLC:PakLoaderPlugin插件实战与避坑指南
  • 长沙芙蓉区宠物驱虫医院推荐,靠谱门店就医指南 - GrowthUME
  • 2026阜阳婚纱照不踩坑攻略!5家本土摄影暗访实录,附价格区间 - 生活测评君
  • 2026年广东全自动焊锡机定制厂家名单:避开中间商,直选源头工厂,厂家直销无差价 - 变量人生001
  • SLA关键条款避坑指南
  • 智能成衣视觉质检系统:关键点位标准化与全量时序动作判定
  • DDR5内存架构深度解析:从双子通道到片上ECC的技术演进与设计挑战