2102-序列顺序查询
一个观光景点由它的名字 name
和景点评分 score
组成,其中 name
是所有观光景点中 唯一 的字符串,score
是一个整数。景点按照最好到最坏排序。景点评分 越高 ,这个景点越好。如果有两个景点的评分一样,那么 字典序较小 的景点更好。
你需要搭建一个系统,查询景点的排名。初始时系统里没有任何景点。这个系统支持:
- 添加 景点,每次添加 一个 景点。
- 查询 已经添加景点中第
i
好 的景点,其中i
是系统目前位置查询的次数(包括当前这一次)。- 比方说,如果系统正在进行第
4
次查询,那么需要返回所有已经添加景点中第4
好的。
- 比方说,如果系统正在进行第
注意,测试数据保证 任意查询时刻 ,查询次数都 不超过 系统中景点的数目。
请你实现 SORTracker
类:
SORTracker()
初始化系统。void add(string name, int score)
向系统中添加一个名为name
评分为score
的景点。string get()
查询第i
好的景点,其中i
是目前系统查询的次数(包括当前这次查询)。
示例:
**输入:**
["SORTracker", "add", "add", "get", "add", "get", "add", "get", "add", "get", "add", "get", "get"]
[[], ["bradford", 2], ["branford", 3], [], ["alps", 2], [], ["orland", 2], [], ["orlando", 3], [], ["alpine", 2], [], []]
**输出:**
[null, null, null, "branford", null, "alps", null, "bradford", null, "bradford", null, "bradford", "orland"]
**解释:**
SORTracker tracker = new SORTracker(); // 初始化系统
tracker.add("bradford", 2); // 添加 name="bradford" 且 score=2 的景点。
tracker.add("branford", 3); // 添加 name="branford" 且 score=3 的景点。
tracker.get(); // 从好带坏的景点为:branford ,bradford 。
// 注意到 branford 比 bradford 好,因为它的 **评分更高** (3 > 2) 。
// 这是第 1 次调用 get() ,所以返回最好的景点:"branford" 。
tracker.add("alps", 2); // 添加 name="alps" 且 score=2 的景点。
tracker.get(); // 从好到坏的景点为:branford, alps, bradford 。
// 注意 alps 比 bradford 好,虽然它们评分相同,都为 2 。
// 这是因为 "alps" **字典序** 比 "bradford" 小。
// 返回第 2 好的地点 "alps" ,因为当前为第 2 次调用 get() 。
tracker.add("orland", 2); // 添加 name="orland" 且 score=2 的景点。
tracker.get(); // 从好到坏的景点为:branford, alps, bradford, orland 。
// 返回 "bradford" ,因为当前为第 3 次调用 get() 。
tracker.add("orlando", 3); // 添加 name="orlando" 且 score=3 的景点。
tracker.get(); // 从好到坏的景点为:branford, orlando, alps, bradford, orland 。
// 返回 "bradford".
tracker.add("alpine", 2); // 添加 name="alpine" 且 score=2 的景点。
tracker.get(); // 从好到坏的景点为:branford, orlando, alpine, alps, bradford, orland 。
// 返回 "bradford" 。
tracker.get(); // 从好到坏的景点为:branford, orlando, alpine, alps, bradford, orland 。
// 返回 "orland" 。
提示:
name
只包含小写英文字母,且每个景点名字互不相同。1 <= name.length <= 10
1 <= score <= 105
- 任意时刻,调用
get
的次数都不超过调用add
的次数。 - 总共 调用
add
和get
不超过4 * 104
为了高效插入数据,我们可以用平衡树来维护所有景点。
注意到每次 get
后仅会将查询次数加一,我们可以用一个迭代器(指针)cur 指向查询需要返回的元素,这样对于查询操作,每次查询结束后将 cur 移至其下一个元素。
对于添加操作,如果添加的景点排在 cur 前面,那么为了保证 cur 仍然指向第 i 好的景点,我们将 cur 移至其前一个元素,否则不移动 cur。
代码实现时,可以在初始化时插入一个哨兵元素,从而简化判断逻辑。
1 | class SORTracker { |
1 | type pair struct { |
Python 用户可以直接用 SortedList
模拟。
1 | from sortedcontainers import SortedList |
Comments