当前位置: 首页 > news >正文

leetcode 3508 设计路由器 模拟 深拷贝 二分 bound

题目比较复杂,主要体现在流程很长,就是队列加二分的操作

难点1:深拷贝
主要问题1,看下面这段核心代码:

    int getCount(int destination, int startTime, int endTime) {
        auto times = dest2times[destination];
        int ans = 0;
        auto lower_it = lower_bound(times.begin(), times.end(), startTime);
        size_t lower_idx = lower_it - times.begin();
        auto upper_it = upper_bound(times.begin(), times.end(), endTime);
        size_t upper_idx = upper_it - times.begin();
        ans = upper_idx - lower_idx;
    
        return ans;
    }

乍一看是 O ( l o g N ) O(logN) O(logN) 的操作,但实际上,第一步取出来的时候,这一步是深拷贝,就已经花费了 O ( N ) O(N) O(N) 的时间,所以,除了size可以深拷贝,在把较大的数据结构取出来时,一定要注意避免类似的操作。

难点2:二分
上述代码,都减去了times.begin(),其实是重复操作,用下面的代码更为简洁

    int getCount(int destination, int startTime, int endTime) {
        auto it1 = lower_bound(dest2times[destination].begin(), dest2times[destination].end(), startTime);
        auto it2 = upper_bound(dest2times[destination].begin(), dest2times[destination].end(), endTime);
        return it2-it1;
    }

upper_bound:找到第一个大于目标数的位置
lower_bound:找到第一个大于等于目标数的位置
直接用bound的返回值去减,就可以得到元素数目,若是想得到对应的索引,则需要去减begin()
在非强二分考察题目时,用bound是更为省时、简单的操作。

附ac代码

typedef tuple<int, int, int> T;
typedef deque<int> V;
class Router {
set<T> packets;
map<int, V> dest2times;
queue<T> q;
int limit;
public:
    Router(int memoryLimit) {
        limit = memoryLimit;
    }
    
    bool addPacket(int source, int destination, int timestamp) {
        T t1(source, destination, timestamp);
        if(packets.count(t1))return false;
        if(q.size() == limit){
            T t2 = q.front();
            dest2times[get<1>(t2)].pop_front();
            packets.erase(t2);
            q.pop();
        }
        dest2times[destination].push_back(timestamp);
        q.push(t1);
        packets.insert(t1);
        
        return true;
    }
    
    vector<int> forwardPacket() {
        if(q.size() == 0)return vector<int>{};
        
        T t2 = q.front();
        dest2times[get<1>(t2)].pop_front();
        packets.erase(t2);
        q.pop();

        return vector<int>{get<0>(t2), get<1>(t2), get<2>(t2)};
    }

    int findFirst(V& nums, int target){
        int n = nums.size();
        int l = 0, r = n-1;
        while(l<r){
            int mid = l + (r-l)/2;
            if(nums[mid] < target)l = mid+1;
            else r = mid;
        }
        return l;
    }
    
    int findLast(V& nums, int target){
        int n = nums.size();
        int l = 0, r = n-1;
        while(l<r){
            int mid = l + (r-l+1)/2;
            if(nums[mid] > target)r = mid-1;
            else l = mid;
        }
        return l;
    }

    int getCount(int destination, int startTime, int endTime) {
        int ans = 0;
        int start = findFirst(dest2times[destination], startTime);
        int end = findLast(dest2times[destination], endTime);
        if(dest2times[destination][start] >= startTime and dest2times[destination][end] <= endTime)ans = end-start+1;
        return ans;
    }
};

/**
 * Your Router object will be instantiated and called as such:
 * Router* obj = new Router(memoryLimit);
 * bool param_1 = obj->addPacket(source,destination,timestamp);
 * vector<int> param_2 = obj->forwardPacket();
 * int param_3 = obj->getCount(destination,startTime,endTime);
 */
http://www.dtcms.com/a/129953.html

相关文章:

  • (即插即用模块-特征处理部分) 三十二、(TGRS 2024) MDAF 多尺度双表示对齐过滤器
  • 深入解析TCP拥塞控制机制:从原理到现代算法优化
  • 如何在Agent中设置Memory
  • 【数学建模】佳点集(Good Point Set)在智能优化算法中的应用与实现
  • ChatGPT-如何让AI写作不那么生硬!
  • 学习笔记九——Rust所有权机制
  • 探索 MCP 和 A2A 协议: 本质上新协议都基于 HTTP的
  • 【Spring底层分析】Spring IoC
  • RocketMQ 安装时启动一闪而过 start mqnamesrv.cmd
  • 插值算法 - 最近邻插值实现
  • 用python写一个简单的射击游戏
  • skynet.socket 完整通信流程
  • Mysql8配置文件
  • 【贪心之摆动序列】
  • 三、Virtual Device Manager
  • CST1019.基于Spring Boot+Vue智能洗车管理系统
  • 从零手写RPC-version0
  • Android游戏逆向工程全面指南
  • MySQL慢查询全攻略:定位、分析与优化实战
  • Python 深度学习 第5章 机器学习的核心问题泛化及如何提高模型的泛化能力实例
  • 【MySQL】关于何时使用start slave和start slave user=‘’ password=‘’
  • 计算机的发展及应用
  • minio重大更新!RELEASE.2025-04-08T15-41-24Z发布:修复关键Bug,存储管理更高效!
  • 基于PyQt5的Jupyter Notebook转Python工具
  • 生物化学笔记:医学免疫学原理16 自身免疫和自身免疫性疾病
  • 电感特性参数、选型方法与厂商推荐
  • Spring Boot(二十二):RedisTemplate的List类型操作
  • DWS常用操作手册
  • Windows 10和Windows 11系统截图的9种方式【简便实用】
  • Mac M1管理多个Node.js版本