【英雄算法六月集训】Day15

【英雄算法六月集训】Day15

933. 最近的请求次数

class RecentCounter {
    Queue<Integer> queue;

    public RecentCounter() {
        queue = new ArrayDeque<>();
    }

    public int ping(int t) {
            queue.offer(t);
            while (queue.peek() < t-3000){
                queue.poll();
            }
            return queue.size();
    }
}

1700. 无法吃午餐的学生数量

解法1

class Solution {

    public int countStudents(int[] students, int[] sandwiches) {
        int sindex=0;
        int aindex=0;      
        int limit=0;
        while(sindex<students.length&&aindex < sandwiches.length){
            if(students[sindex] == sandwiches[aindex]){
                ++sindex;
                ++aindex;
            }else{
          
                System.arraycopy(students,0,tmpStus,0,students.length);
                tmpStus[students.length] = students[sindex];
                students = tmpStus;
                sindex++;
                if(limit++>=10000)break;
            }
        }
        return students.length-sindex;
    }
}

解法2

class Solution {
    public int countStudents(int[] students, int[] sandwiches) {
        int[] cnt = new int[2];
        for (int student : students) cnt[student]++;
        for (int sandwich : sandwiches) {
            if (cnt[sandwich] > 0) cnt[sandwich]--;
            else break;
        }
        return cnt[0] + cnt[1];
    }
}

2073. 买票需要的时间

模拟,当k个位置需要买的票数不为0的时候,一直执行下面的操作。遍历tickets数组,每次遍历 如果票没买完,则模拟一次买票,票数需要减少1,并计算一次耗时。并且判断k位置上的票买完了吗,买完了,提前退出循环

class Solution {
    public int timeRequiredToBuy(int[] tickets, int k) {
        int sumwaittime=0;
        int n = tickets.length;
        while(tickets[k]!=0){
            for(int i=0;i<n;++i){
               if(tickets[i] !=0){
                   tickets[i]--;
                   ++sumwaittime;
               }
               if(tickets[k]==0){
                   break;
               }
            }
        }
        return sumwaittime;
    }
}

239. 滑动窗口最大值

维护一个双端队列,遍历nums 一个while循环,保证队首元素所存下标指向的值为最大值

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums==null||nums.length<2) return nums;
        LinkedList<Integer> q = new LinkedList();
        int[] result = new int[nums.length-k+1];
        int i;
        for(i=0;i<nums.length;++i){
            while(!q.isEmpty()&&nums[q.peekLast()]<=nums[i]){
                q.pollLast();
            }
            q.addLast(i);

            if(q.peek()<=i-k){
                q.poll();
            }
            if(i-k+1>=0){
                result[i-k+1] = nums[q.peek()];
            }
        }
        return result;


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值