利用双向链表计算第i个位置左侧第k个比a[i]大的位置 trick

问题:给定a1,a2,...,an,对于每个i[1,n],求出从i左侧开始数 第一个和第二个 元素值>a[i]的位置

只求第一个,可以用单调栈来做。但要得到第k个,应该怎么做呢?

  1. 将数组按顺序构建双向链表
  2. 先将原数组按值排序,排序时要记录每个元素原来的位置。
  3. 排序后数组中的第一个数即为最小值,找到它在链表中位置(由于是按顺序建立的链表,因此链表中每个元素的idx和原位置是一一对应的,可直接得到;在无重复值的情况下用map记录(val,pos)对应关系也行)。由于是最小值,其左侧所有元素均比它大,因此直接从链表中的该位置开始,向左走k步就是左侧第k>a[i]的位置。在k较小时可以直接暴力得到。
  4. 求完最小值的答案后,要在链表中删除最小值,再看次小值。此时这个值又成为了链表中的最小值,继续刚才的操作就可以得到这个数的答案。
  5. 对每个数都做这样的操作即可,复杂度O(nk)。(k一般都很小)
posted @   jxs123  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示
主题色彩