[LC]2343.裁剪数字后查询第k小的数字
题目
给你一个下标从 0 开始的字符串数组 nums ,其中每个字符串 长度相等 且只包含数字。
再给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [ki, trimi] 。对于每个 queries[i] ,你需要:
- 将 
nums中每个数字 裁剪 到剩下 最右边trimi个数位。 - 在裁剪过后的数字中,找到 
nums中第ki小数字对应的 下标 。如果两个裁剪后数字一样大,那么下标 更小 的数字视为更小的数字。 - 将 
nums中每个数字恢复到原本字符串。 
请你返回一个长度与 queries 相等的数组 answer,其中 answer[i]是第 i 次查询的结果。
提示:
- 裁剪到剩下最右边 
x个数位的意思是不断删除最左边的数位,直到剩下x个数位。 nums中的字符串可能会有前导 0 。
分析
大顶堆
依次处理每个query,处理每个query的时候用大顶堆的方式找到第k小的数字。
重点
在自定义比较操作的时候,不要使用 substr,substr 会进行拷贝操作,开销较高,应该使用 std::string::compare 对子串进行比较。
代码
1  |  | 
时间复杂度
假设总共有$m$个query,数字数组大小为$n$,字符串的长度为$s$.
一个query的时间复杂度为$O(ntrim_ilogk_i).$
所以总的时间复杂度为$O(n\Sigma_{i=1}^mtrim_ilogk_i)$
空间复杂度:$O(k).$
[LC]2343.裁剪数字后查询第k小的数字
      https://erlsrnby04.github.io/2024/10/08/LC-2343-裁剪数字后查询第k小的数字/