LRU和最长前缀和(计算机网络算法)

1. 最长公共前缀 LeetCode 14

最优时间:\(O(mn)\),m 字符串平均长度,n 字符串数量;空间\(O(1)\),原地处理 思路:拿第一个字符串当基准,逐个字符比对其余所有字符串,遇到不匹配 / 越界直接截断返回。

cpp 复制代码
#include <vector>
#include <string>
using namespace std;

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";
        // 以第一个串为基准
        for(int i = 0; i < strs[0].size(); ++i){
            char c = strs[0][i];
            for(int j = 1; j < strs.size(); ++j){
                // 当前串长度不够i 或者字符不等,直接截取前缀返回
                if(i >= strs[j].size() || strs[j][i] != c){
                    return strs[0].substr(0,i);
                }
            }
        }
        return strs[0];
    }
};

2.LRU 缓存 LeetCode 146

最优解法:哈希表 + 双向链表

  • get/put 均摊 \(O(1)\)
  • std::list 双向链表;unordered_map 保存 key 到链表迭代器映射
  • list 头部:最近使用;尾部:最久未使用,满容量删除尾部
cpp 复制代码
#include <unordered_map>
#include <list>
using namespace std;

class LRUCache {
private:
    int cap;
    // key,value
    list<pair<int,int>> l;
    // key -> list迭代器
    unordered_map<int, list<pair<int,int>>::iterator> mp;

public:
    LRUCache(int capacity) {
        cap = capacity;
    }

    int get(int key) {
        auto it = mp.find(key);
        if(it == mp.end()){
            return -1;
        }
        // 取出节点,移动到链表头部(标记最近访问)
        auto node_it = it->second;
        int val = node_it->second;
        l.erase(node_it);
        l.push_front({key,val});
        mp[key] = l.begin();
        return val;
    }

    void put(int key, int value) {
        auto it = mp.find(key);
        // 1.key已经存在:删除旧节点,头部插入新值
        if(it != mp.end()){
            l.erase(it->second);
        }else{
            // 2.不存在,容量满,删掉最久未使用(链表尾部)
            if(l.size() >= cap){
                auto last = l.back();
                mp.erase(last.first);
                l.pop_back();
            }
        }
        l.push_front({key,value});
        mp[key] = l.begin();
    }
};
相关推荐
打码的老程是远篁4 分钟前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风5 分钟前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
用户7341681035488 分钟前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法
Ivanqhz10 分钟前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习
罗湖老棍子19 分钟前
荒岛野人(信息学奥赛一本通- P1637)(洛谷-P2421)
算法·数论·枚举·裴蜀定理·扩展欧几里得·扩展中国剩余定理
朝朝辞暮i23 分钟前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
400分31 分钟前
具身智能系列之从零到「机械臂会放试管」:π0.5 VLA 真机部署完全指南【第一节】
算法
小宋102141 分钟前
一套服务托管多个 LoRA:适配器加载、租户隔离与热切换实战
大数据·人工智能·算法
Rosanci1 小时前
Codex 下载与本地部署实战:从安装到运行全流程指南
开发语言·前端·算法·chatgpt·codex
我爱工作&工作love我1 小时前
P14358 [CSP-J 2025] 座位
算法