leetcode933.NumberofRecentCalls

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011732358/article/details/83833428

题目:依次输入数据,每次输入一个数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();
    }
}

猜你喜欢

转载自blog.csdn.net/u011732358/article/details/83833428