LeetCode day23

LeetCode day23


嘛,打开力扣,不知道为啥突然感觉可以看眼每日一题。还是困难!?


上面是本人昨天的自不量力。。。直接被狠狠拷打,看到评论区有句话很不错,当一个题是困难而我第一想法就是暴力,那可以睡觉了。


933. 最近的请求次数

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请你实现 RecentCounter 类:

  • RecentCounter() 初始化计数器,请求数为 0 。
  • int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。

保证 每次对 ping 的调用都使用比之前更大的 t 值。

示例 1:

输入:
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
输出:
[null, 1, 2, 3, 3]

解释:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1],范围是 [-2999,1],返回 1
recentCounter.ping(100);   // requests = [1, 100],范围是 [-2900,100],返回 2
recentCounter.ping(3001);  // requests = [1, 100, 3001],范围是 [1,3001],返回 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3

class RecentCounter {
    LinkedList<Integer> queue=new LinkedList<>();
    public RecentCounter() {

    }

    public int ping(int t) {
        while(!queue.isEmpty()){
          if(t-queue.peek()>3000){
                queue.poll();
            }else{
                break;
            }
        }
        queue.offer(t);
        return queue.size();
    }
}

class RecentCounter {
public:
    queueq;
    RecentCounter() {

    }
    
    int ping(int t) {
        while(!q.empty()){
            if(t-q.front()>3000){
                q.pop();
            }
            else {
                break;
            }
        }
         q.push(t);
        return q.size();
    }
};

额,这个队列函数名有点⛏,搞得我还去clion那边去看c++队列的函数是什么样子。


LCR 041. 数据流中的移动平均值

给定一个窗口大小和一个整数数据流,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。

实现 MovingAverage 类:

  • MovingAverage(int size) 用窗口大小 size 初始化对象。
  • double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后 size 个值的移动平均值,即滑动窗口里所有数字的平均值。

示例:

输入:
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出:
[null, 1.0, 5.5, 4.66667, 6.0]

解释:
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3

class MovingAverage {
    LinkedList<Integer>queue=new LinkedList<>();
    int size;
    /** Initialize your data structure here. */
    public MovingAverage(int size) {
        this.size=size;
    }
    
    public double next(int val) {
        if(queue.size()==size){
            queue.poll();
        }
        queue.offer(val);
        double sum=0;
        for(int x:queue){
            sum+=x;
        }
        return sum/queue.size();
    }
}

1979. 找出数组的最大公约数

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数

两个数的 最大公约数 是能够被两个数整除的最大正整数。

示例 1:

输入:nums = [2,5,6,9,10]
输出:2
解释:
nums 中最小的数是 2
nums 中最大的数是 10
2 和 10 的最大公约数是 2

示例 2:

输入:nums = [7,5,6,8,3]
输出:1
解释:
nums 中最小的数是 3
nums 中最大的数是 8
3 和 8 的最大公约数是 1

示例 3:

输入:nums = [3,3]
输出:3
解释:
nums 中最小的数是 3
nums 中最大的数是 3
3 和 3 的最大公约数是 3
class Solution {
    public int GCD(int a,int b){
      int c=b%a;
        while(c!=0){
            b=a;
            a=c;
            c=b%a;
        }
        return a;
    }
    
    public int findGCD(int[] nums) {
        Arrays.sort(nums);
        int max=nums[nums.length-1];
        int min=nums[0];
        return GCD(max,min);
    }
}

大一死去的记忆正在攻击我,虽然知道辗转相除法,但是也就记得名字了,我tm直接哭死

你可能感兴趣的:(leetcode,算法)