【坚持每日一题9.22】数字流的秩

假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:

实现 track(int x) 方法,每读入一个数字都会调用该方法;

实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。

注意:本题相对原题稍作改动

示例:

输入:
[“StreamRank”, “getRankOfNumber”, “track”, “getRankOfNumber”]
[[], [1], [0], [0]]
输出:
[null,0,null,1]
提示:

x <= 50000
track 和 getRankOfNumber 方法的调用次数均不超过 2000 次

java代码:
class StreamRank {

    public StreamRank() {
        list = new ArrayList<>();
    }
    List<Integer> list;
    public void track(int x) {
        int i = 0;
        int j = list.size()-1;
        while(i <= j){
            int m = i + (j-i)/2;
            if(list.get(m) < x){i = m+1;}
            else{j = m-1;}
        }// 寻找第一个比它大的数
        list.add(i, x);// 在其下标处插入x
    }

    public int getRankOfNumber(int x) {
        int i = 0;
        int j = list.size()-1;
        while(i <= j){
            int m = i + (j-i)/2;
            if(list.get(m) > x){j = m-1;}
            else{i = m+1;}
        }// 寻找最后一个不大于它的数
        return j+1;// 下标加1才是元素数目(秩)
    }
}

/**
 * Your StreamRank object will be instantiated and called as such:
 * StreamRank obj = new StreamRank();
 * obj.track(x);
 * int param_2 = obj.getRankOfNumber(x);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值