【每日刷题】Day184

devtools/2025/3/1 12:13:52/

【每日刷题】Day184

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 1700. 无法吃午餐的学生数量 - 力扣(LeetCode)

2. 146. LRU 缓存 - 力扣(LeetCode)

1. 1700. 无法吃午餐的学生数量 - 力扣(LeetCode)

//思路:队列

//本题要点在于如何判断剩下的学生无法吃午餐,其实无非就是两种情况:

//当满足这两种情况的任意一种时,剩余的学生就无法吃到午餐。

class Solution {

int flag = 0;

public:

    int countStudents(vector<int>& students, vector<int>& sandwiches)

    {

        int sum = 0;//这里用sum变量来判断两种情况

        queue<int> student;

        queue<int> sandwiche;

        for(auto& i : students)

        {

            student.push(i);

            sum+=i;

        }

        for(auto& i : sandwiches)

            sandwiche.push(i);

        while(true)

        {

            if(student.front()==sandwiche.front())

            {

                sum-=student.front();

                student.pop();

                sandwiche.pop();

            }

            else

            {

                int tmp = student.front();

                student.pop();

                student.push(tmp);

            }

            if(student.empty()) break;

//sum==(sandwiche.front()+student.size())    判断的是情况①

//sum<sandwiche.front()    判断的是情况②

            if((sum==(sandwiche.front()+student.size()))||sum<sandwiche.front())

                break;

        }

        return student.size();

    }

};

2. 146. LRU 缓存 - 力扣(LeetCode)

//思路:双向链表+哈希表

//哈希表用于查询 key 是否已经存储;双向链表用于进行插入节点以及更新使用过的节点:保证最久没有使用过的节点处于链表末尾

class LRUCache

{

    struct ListNode//链表节点

    {

        int _key,_val;

        ListNode* _next;

        ListNode* _prev;

        ListNode():_key(-1),_val(-1),_next(nullptr),_prev(nullptr)

        {}

        ListNode(int key,int val):_key(key),_val(val),_next(nullptr),_prev(nullptr)

        {}

    };

public:

    LRUCache(int capacity)

    {

        _head = new ListNode();

        _tail = new ListNode();

        _head->_next = _tail;//头尾节点采用 "哨兵位" 形式

        _tail->_prev = _head;

        _capacity = capacity;

    }

   

    int get(int key)

    {

        if(ma.count(key))//如果要获取的key存在,则返回对应的val

        {

            ListNode* curr = ma[key];

            DeleteNode(curr);

            MoveToHead(curr);//同时,将节点更新到链表头部,表示当前节点为最新访问过的

            return ma[key]->_val;

        }

        return -1;//不存在则返回-1

    }

   

    void put(int key, int value)

    {

        if(!ma.count(key))//不存在key,新插入节点

        {

            ListNode* newnode = new ListNode(key,value);

            MoveToHead(newnode);//同时更新节点到链表头部,表示当前节点为最新访问过的

            ma[key] = newnode;//写入哈希表中

            _size++;//更新当前队列长度

        }

        else//存在key,则更新val

        {

            ListNode* curr = ma[key];//获取已经存在的key对应的节点

            curr->_val = value;

            DeleteNode(curr);//因为key对应的节点已经存在于队列中,因此更新时需要将原本旧节点所在位置的前后节点更新

            MoveToHead(curr);//将节点更新到链表头部

        }

        if(_size>_capacity)//超出容量,删除尾部最久未使用的key对应的节点

        {

            ListNode* tail = GetTail();//因为使用的是"哨兵位"模式,因此tail->_prev指向的就是链表尾部节点

            ma.erase(tail->_key);

            DeleteNode(tail);

            delete tail;

            _size--;

        }

    }

//获取尾部节点:最久未访问的节点

    ListNode* GetTail()

    {

        return _tail->_prev;

    }

//删除节点

    void DeleteNode(ListNode* curr)

    {

        curr->_prev->_next = curr->_next;

        curr->_next->_prev = curr->_prev;

    }

//将节点更新到链表头部

    void MoveToHead(ListNode* curr)

    {

        curr->_prev = _head;

        curr->_next = _head->_next;

        _head->_next->_prev = curr;

        _head->_next = curr;

    }

private:

    int _capacity = 0;

    int _size = 0;

    ListNode* _head;

    ListNode* _tail;

    unordered_map<int,ListNode*> ma;//哈希表 key 映射 结点指针

};


http://www.ppmy.cn/devtools/163613.html

相关文章

SQL Server 视图的更新排查及清除缓存

目录 前言排查方向 前言 获取数据的时候&#xff0c;发现数据少了两个字段值&#xff0c;归根原因是Java中的实体类少写了两个&#xff0c;后续补充上就好了&#xff01; 但也正了解到视图中的刷新原理以及排查机制&#xff0c;如果确认是视图等引起&#xff0c;可结合如下文…

【MyBatis】核心配置文件详解

文章目录 MyBatis核心配置文件详解1.configuration&#xff1a;2.environments&#xff1a;3.environmen&#xff1a;4.transactionManager&#xff1a;5.dataSource&#xff1a;5.1 UNPOOLED&#xff1a;5.2 POOLED&#xff1a;5.3 JNDI&#xff1a; 6. properties7. mapper M…

使用Fuse-DFS挂载文件存储 HDFS-后端存储ceph

1. 编译环境准备 yum install cmake3 ln -s /usr/bin/cmake3 /usr/bin/cmake yum install gcc-c安装挂载依赖 yum -y install fuse fuse-devel fuse-libs执行以下命令&#xff0c;载入FUSE模块 modprobe fuse2. 下载源码包 hadoop-3.3.4-src.tar.gz解压后执行以下命令 打开…

Transformer 代码剖析3 - 参数配置 (pytorch实现)

一、硬件环境配置模块 参考&#xff1a;项目代码 原代码实现 """ author : Hyunwoong when : 2019-10-22 homepage : https://github.com/gusdnd852 """ import torch # GPU device setting device torch.device("cuda:0" if tor…

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;网络变压器的主要电性参数与测试方法&#xff08;2&#xff09;.. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法&#xff1a; 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…

SV基础(二):数据类型

文章目录 **1. Verilog 的 4 值数据类型****硬件建模的必要性****2. Testbench 中的问题****Verilog 的局限性****3. SystemVerilog 的 2 值数据类型****示例:明确的 2 值操作****4. 何时使用 2 值 vs 4 值****5. 关键优势****6. 注意事项**7. 有符号数与无符号数详解**无符号…

基于STM32的智能教室管理系统

1. 引言 传统教室管理依赖人工操作&#xff0c;存在设备控制分散、能源浪费严重、环境舒适度低等问题。本文设计了一款基于STM32的智能教室管理系统&#xff0c;通过多环境参数监测、设备智能联动与数据驱动优化&#xff0c;实现教室设备集中管控、能耗精细化管理与学习环境自…