题目
假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:
实现 track(int x) 方法,每读入一个数字都会调用该方法;
实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。
解题思路
二分查找
代码
class StreamRank {
List<Integer> list;
public StreamRank() {
list = new ArrayList<>();
}
public void track(int x) {
// 找到第一个大于x的位置,插入x
list.add(search(x), x);
}
public int getRankOfNumber(int x) {
return search(x);
}
private int search(int x) {
int l = 0, r = list.size() - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (list.get(mid) > x) r = mid - 1;
else l = mid + 1;
}
return l;
}
}