首页 > 其他分享 >链表巧用

链表巧用

时间:2023-02-22 20:14:37浏览次数:58  
标签:复杂度 个数 中位数 链表 序列 排序 巧用

题目类型总结

最近在阅读《算法竞赛进阶指南》这本书的链表这一节时,学会了链表在一类特定问题中的巧妙用法,遂有此文,也算是自己的一个学习笔记。

考虑这样一类问题,一个长度为\(n\)的序列,有\(q\)询问,询问序列前任意个数的一个结果,该结果可通过暴力排序后直接判断,但是这种方法显然很暴力,很容易达到\(O(qn\log n)\)的复杂度。

使用链表进行优化,先将序列全部读进来后进行排序,之后通过删除操作达到前任意段排完序后的序列。此时,只需进行一次排序,后面直接进行删除操作即可,效率大幅上升。

例题

该做法的一个经典应用即动态中位数问题,即一段长度为\(n\)的序列,依次输出前\(i\)个数的中位数,当然做法不止一种,这里讨论链表做法。

将\(n\)个数读进来,进行一个序的排,然后按顺序建立链表,同时建立辅助数组,存储每个数在链表里的位置。

首先可以找到\(n\)个数时的中位数,然后讲第\(n\)个数从链表中删去,如果这个数在链表中的位置在中位数之前,将中位数指针向后移动即可,相反的向前移动。

重复此操作,得到所有位置的答案。时间复杂度\(O(n\log n)\)

练习题

AcWing 136. 邻值查找

SPOJ15376 RMID - Running Median /Acwing 106. 动态中位数

[HNOI2002]营业额统计

标签:复杂度,个数,中位数,链表,序列,排序,巧用
From: https://www.cnblogs.com/six-one/p/17124837.html

相关文章

  • 巧用性格上的差异来组建团队
    你好,我是得物App交易平台及中间件平台的TeamLeaderAlan。组建团队过程中,你有没有遇到过类似的场景:团队中某些人之间总是互相不对付、气场不合,不管是日常沟通中还是方......
  • 巧用性格上的差异来组建团队
    你好,我是得物App交易平台及中间件平台的TeamLeaderAlan。组建团队过程中,你有没有遇到过类似的场景:团队中某些人之间总是互相不对付、气场不合,不管是日常沟通中还是方......
  • 《剑指Offer》-18-删除链表的节点
    这不就,真是删除链表节点的基操 ListNode*deleteNode(ListNode*head,intval){ //需要额外考虑的是删除头节点、尾节点的特殊情况 ListNode*virtual_head=ne......
  • 判断单链表是否成环
    快指针与慢指针在环中,快指针走两步,慢指针走一步,快慢指针一定会相遇。需要注意的是,快慢指针相遇的地方,不一定是环的入口。publicstaticbooleanisCircleByTwoPoint(Lis......
  • 02.07. 链表相交
    1//暴力法2ListNode*getIntersectionNode(ListNode*headA,ListNode*headB){3if(headA==nullptr||headB==nullptr)returnnullptr;4......
  • 力扣days02 链表
    力扣203.移除链表元素力扣707.设计链表已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目;力扣206.反转链表再定义一个新的链表,实现链表元素的反转,是......
  • Java链表
    链表顺序表性质链表不同于顺序表,顺序表底层采用数组作为存储容器,需要分配一块连续且完整的内存空间进行使用,而链表则不需要,它通过一个指针来连接各个分散的结点,形成了......
  • leetcode 141. 环形链表
    哈希classSolution{public:boolhasCycle(ListNode*head){map<ListNode*,int>mp;while(head){if(mp[head]==1){......
  • leetcode 382. 链表随机节点
    从头开始计数第i个点选择的概率是只需要区[0,i-1]的随机数,如果,取到了0,就更新返回值,否则不更新classSolution{public:/**@paramheadThelinkedlist'shead.......
  • 19. 删除链表的倒数第 N 个结点
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*......