力扣春招100题——队列

字符串中的第一个唯一字符

题目

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

思路

这题根本没必要用队列,直接用哈希表就够了

  • 使用哈希表记录字符出现的次数:遍历字符串,将每个字符及其出现的次数存储在哈希表中。
  • 使用队列保存候选字符:将每个只出现一次的字符入队。
  • 从队列中寻找第一个不重复字符:出队检查队列中第一个字符是否重复,如果重复则移除,直到找到第一个不重复的字符或者队列为空。

代码

java 复制代码
public int firstUniqChar(String s) {
        Queue<int[]> q = new LinkedList<int[]>();
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(map.containsKey(c)){
                map.put(c,map.get(c)+1);
            }else{
                map.put(c,1);
            }
            q.offer(new int[]{c,i});
        }
        while(!q.isEmpty()){
            int[] arr = q.peek();
            char c = (char)arr[0];
            if(map.get(c)==1){
                return arr[1];
            }
            q.poll();
        }
        return -1;
    }

最近的请求次数

题目

933. 最近的请求次数 - 力扣(LeetCode)

思路

  • 将时间戳添加到队列
  • 每次都移除无效的队列元素,然后返回队列大小

代码

java 复制代码
class RecentCounter {
    Queue<Integer> queue;

    public RecentCounter() {
        queue = new LinkedList<Integer>();
    }
    
    public int ping(int t) {
        queue.add(t);
        while(!queue.isEmpty()&&queue.peek() < t-3000) {
            queue.poll();
        }
        return queue.size();
    }
}

你可以安排的最多任务数目

题目

2071. 你可以安排的最多任务数目 - 力扣(LeetCode)

思路

  • 排序:对任务和工人的力量值排序。
  • 二分查找:二分查找可以完成的最大任务数。
  • 贪心策略:判断给定的任务数是否能完成,优先用不需要药丸的工人来完成任务,必要时使用药丸。

代码

java 复制代码
public int maxTaskAssign(int[] tasks, int[] workers, int pills, int strength) {
        Arrays.sort(tasks);
        Arrays.sort(workers);
       int l=0,r=Math.min(tasks.length,workers.length);
       while(l<r){
           int mid=(l+r+1)/2;
           if(fun(mid,tasks,workers,pills,strength)){
               l=mid;
           }else{
               r=mid-1;
           }
       }
       return l;
    }

    private boolean fun(int x, int[] tasks, int[] workers, int pills, int strength) {
        Deque<Integer> deque = new ArrayDeque<>();
        int sum=0;
        int j=workers.length-1;
        for(int i=x-1;i>=0;i--){
            while(j>=0&&workers[j]+strength>=tasks[i]){
                deque.addLast(workers[j]);
                j--;
            }
            if(deque.isEmpty()){
                return false;
            }
            if(deque.peekFirst()>=tasks[i]){
                deque.removeFirst();
            }else if(sum<pills){
                deque.removeLast();
                sum++;
            }else{
                return false;
            }
        }
        return true;
    }

结语

这个题组的难度,比原来的难度大多了,写的心碎了,好菜,怎么这么菜

相关推荐
m0_629494732 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
壹号用户2 小时前
用队列实现栈
数据结构·算法
做人求其滴2 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣
daad7772 小时前
记一组无人机IMU传感器数据
算法
计算机安禾2 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
小O的算法实验室2 小时前
2026年KBS,流形感知强化学习差分进化算法+不规则3D无人机路径规划,深度解析+性能实测
算法·智能算法·智能算法改进
玖釉-2 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
不做无法实现的梦~3 小时前
运动控制系统复习一览-----常考题目总结版本
算法
小短腿的代码世界3 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
阿文的代码库3 小时前
一文读懂GROUP BY 1,2 VS GROUP BY column_1, column_2 的区别
算法