leetcode933.NumberofRecentCalls

题目:依次输入数据,每次输入一个数t后,返回其之前所输入的数据在[t-3000,t]区间内的个数, 保证每次输入的数据都比上次大。

思路:用个list来记录,如果第一个数输入进来,直接返回1
然后每次输入进来数后,看看第一个数在不在该区间内,如果在,把该数加到list中,直接返回list大小。如果第一个数不在区间内,然后就用二分查找,找到最接近t-3000数的位置,然后用list大小减去该位置即可。

别人思路:借助 队列 Queue 或者 Deque 数据结构来完成此题目。在每次调用 ping() 方法时,我们便从队列头部开始遍历,判断头部元素是否小于 (当前值t - 3000),如果是,则删除该头部元素。最后,将 t 添加到队列中。

class RecentCounter {

    List<Integer> list = new ArrayList<Integer>() ;
    public RecentCounter() {
        
    }
    public int ping(int t) {
        if(list.size() == 0){
            list.add(t) ;
            return list.size() ;
        }
        if(list.get(0)+3000>=t){
            list.add(t) ;
            return list.size() ;
        }else {
            int left = 1 ;
            int right = list.size()-1 ;
            int mid ;
            while(left<=right){
                mid = (left+right)/2 ;
                if(list.get(mid)+3000>t){
                    right = mid - 1 ;
                }else if(list.get(mid)+3000<t){
                    left = mid +1 ;
                }else{
                    list.add(t) ;
                    return (list.size() - mid) ;
                }
            }
            list.add(t) ;
            return (list.size() - right-1) ;
        }
    }
}

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter obj = new RecentCounter();
 * int param_1 = obj.ping(t);
 */
class RecentCounter {

    Queue<Integer> res;
    public RecentCounter() {
        res = new LinkedList<>();
    }
    
    public int ping(int t) {
        while(!res.isEmpty() && res.peek() < t - 3000){
            res.remove();
        }
        res.offer(t);
        return res.size();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值