利用双向链表计算第i个位置左侧第k个比a[i]大的位置 trick
问题:给定\(a1,a2,...,an\),对于每个\(i\in [1,n]\),求出从\(i\)左侧开始数 第一个和第二个 元素值\(>a[i]\)的位置
只求第一个,可以用单调栈来做。但要得到第\(k\)个,应该怎么做呢?
- 将数组按顺序构建双向链表
- 先将原数组按值排序,排序时要记录每个元素原来的位置。
- 排序后数组中的第一个数即为最小值,找到它在链表中位置(由于是按顺序建立的链表,因此链表中每个元素的\(idx\)和原位置是一一对应的,可直接得到;在无重复值的情况下用\(map\)记录\((val,pos)\)对应关系也行)。由于是最小值,其左侧所有元素均比它大,因此直接从链表中的该位置开始,向左走\(k\)步就是左侧第\(k\)个\(>a[i]\)的位置。在\(k\)较小时可以直接暴力得到。
- 求完最小值的答案后,要在链表中删除最小值,再看次小值。此时这个值又成为了链表中的最小值,继续刚才的操作就可以得到这个数的答案。
- 对每个数都做这样的操作即可,复杂度\(O(nk)\)。(\(k\)一般都很小)