LeetCode 热题 HOT 100 (018/100)【宇宙最简单版】

【信息科学与工程学】【广告科学】第四十四篇 广告平台投放和广告计费类算法01 全行业的中国企业广告投放模型总表。行业分类依据《国民经济行业分类》(GB/T 4754—2017)的门类/大类 ,产品层参考"主营产品统计代码"行业—产品映射 ,平台算法以巨量引擎、腾讯广告等官方文档为硬支撑 ,合规部分严格对齐《互联网广告管理办法》以及2026年市场监管部门最新合规提示 。编号类型(门类)行业(大类)企业及产品内容列表投放模型投放平台投放人群欲望激发维度面向人群模式(地域/文化/年龄/角色)001A 农林牧渔01 农业北大荒/中粮:五常大米、面粉、食用油、杂粮品牌曝光 + 电商转化双轨(C 阅读详情

【链表】No. 0146 LRU缓存【中等】👉力扣对应题目指路

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!

⭐ 题目描述:请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构

  • 实现 LRUCache 类:
    • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
    • int get(int key)
      • 如果关键字 key 存在于缓存中,则返回关键字的值 value
      • 否则返回 -1
    • void put(int key, int value)
      • 如果关键字 key 已经存在,则变更其数据值 value
      • 如果不存在,则向缓存中插入该组 key-value
      • 如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字
    • 【难点🔥】函数 get 和 put 必须以 O(1) 的平均时间复杂度运行

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

  • 因为要根据使用的热度频繁调整存储,所以选用双向链表
    • 本文采用的顺序为:“最近使用的” 放入尾部 tail;“长期未用的” 挤到头部 head
  • 为进一步满足访问 get 的复杂度要求,使用哈希表存储 <key,key 其对应的链表节点>
    • 哈希表的使用可以在 O(1) 时间内,通过 key 找到值 val
  • 示例: 初始化 - put(1,1) - put(2,2) - get(1) - put(3, 3)

    1. 初始化 -------------------------------------------------------------------------------------------------
    2. put(1,1) -------------------------------------------------------------------------------------------------
    3. put(2,2) -------------------------------------------------------------------------------------------------
    4. get(1) --------------------------------------------------------------------------------------------------
    5. put(3, 3) --------------------------------------------------------------------------------------------------
      ,

⭐⭐⭐ 题目准备之双向链表插入、删除元素: 一定要先掌握双向链表插入、删除元素 ❗❗❗ 步骤中用 🍀 重点标记出了~


参考如上思路,给出详细步骤如下:

  • 步骤一⭐编写 LRUCache 的 __init__
    • 初始化容量 self.capacity 和当前大小 self.size
    • 初始化双向链表的 self.head, tail
      • 不要忘记链接好 self.head, tail:self.head.next = self.tail;self.tail.last = self.head
    • 初始化所需的哈希表 self.dict
  • 步骤二⭐编写 LRUCache 的 get: 如果关键字 key 存在于缓存中,则返回关键字的值 value;否则返回 -1
    • 通过哈希表的键来进行逻辑判断 key 是否不存在:if not key in self.dict.keys()
    • 存在的话,将对应节点移动至链表尾部并返回关键字的值 value
      • “短路当前节点”【🍀涉及到两个节点 cur.last, cur.next,共更改两条箭头指向】:当前节点的 last 和 next 链接
      • “重连当前节点”【🍀涉及到三个节点 tail.last, cur, tail,共更改四条箭头指向】:指向好当前节点的 last 和 next
      • 返回 get 结果
  • 步骤三⭐编写 LRUCache 的 put
    • 情况一:如果关键字 key 已经存在,则变更其数据值 value
      • 记得操作一次 get 将改被访问的元素移动到 tail
    • 情况一:如果不存在,则向缓存中插入该组 key-value
      • 如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字
      • 根据 key-value 建立新链表节点 cur 并插入队尾 【🍀涉及到三个节点 tail.last, cur, tail,共更改四条箭头指向】
class ListNode:
    def __init__(self, val=0, next_node=None, last_node=None):
        self.val = val
        self.next = next_node
        self.last = last_node

class LRUCache:
    def __init__(self, capacity: int):  # --------------------- step 1     
        # ---------------------------------------------------- step 1.1
        self.capacity = capacity
        self.size = 0
		# ---------------------------------------------------- step 1.2
        self.head = ListNode()
        self.tail = ListNode()
        self.head.next = self.tail
        self.tail.last = self.head
		# ---------------------------------------------------- step 1.3
        self.dict = {}


    def get(self, key: int) -> int:  # ------------------------ step 2     
        if not key in self.dict.keys():  # ------------------- step 2.1
            return -1
		# ------------------------------------------------- step 2.2.1
        cur = self.dict[key]
        cur.last.next = cur.next
        cur.next.last = cur.last
		# ------------------------------------------------- step 2.2.2
        cur.last = self.tail.last
        cur.next = self.tail
        self.tail.last.next = cur
        self.tail.last = cur
		# ------------------------------------------------- step 2.2.3
        return self.dict[key].val[1]

    def remove_head(self):
        self.head.next = self.head.next.next
        self.head.next.last = self.head

    def put(self, key: int, value: int) -> None:  # ---------- step 3   
    	# --------------------------------------------------- step 3.1
        if key in self.dict.keys():
            self.dict[key].val = [key, value]
            self.get(key)
            return
        #------------------------------------------------- step 3.2.1
        self.size += 1
        if self.size > self.capacity: 
            self.dict.pop(self.head.next.val[0])
            self.remove_head()
            self.size -= 1
		#------------------------------------------------- step 3.2.2
        cur = ListNode([key, value], next_node=self.tail, last_node=self.tail.last)
        self.dict[cur.val[0]] = cur

        self.tail.last.next = cur
        self.tail.last = cur 

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100

[VCS]VCS dump fsdb的精细化控制 本文介绍了VCS FSDB波形dump的精细化控制方法。主要内容包括:1)基本dump方式;2)通过$fsdbDumpoff排除特定层次;3)使用$fsdbDumpvars选择性dump指定模块;4)运行时动态控制dump开关;5)通过文件管理排除列表($fsdbDumpoffFile或自定义读取);6)层次控制策略(剪除整棵树或仅当前层)。这些方法可有效控制波形文件大小,提高仿真效率。 阅读详情

相关推荐

Unity3d游戏开发工程师笔试题学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、学习背景二、错题记录2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以.

m0_54231818的博客 5464

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

关于示波器测485串口波特率的使用方法总结

之前没有用过示波器,更不知道怎么来测试串口的波特率,结果遇到一客户说我们产品的波特率达不到9600,只有9100,为了验证这一说法,我们只能自己测试一下。说明:产品通过485接电脑,用串口调试助手接收都是没有问题的,用客户的设备接收就有问题。 下面说一下示波器测波特率的方法步骤: 显示高低跳变的情况: 1.先把示波器表笔的地线(夹子)夹485B,表笔夹485A。 2.往串口发送数据:如发送

lianxue1986的专栏 3万+

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 175

TDISP(TEE Device Interface Security Protocol)软件操作流程

/ 1. SPDM会话相关定义(🔶1-37、🔶1-187)// SPDM会话ID// AES-256-GCM加密密钥(TDISP要求)// 初始向量// 会话是否激活// 2. IDE流配置(🔶1-52、🔶1-625)// IDE流ID// 4个子流的AES密钥(覆盖所有子流类型)// 密钥是否已配置// 3. TDI状态与配置(🔶1-207、🔶1-210)TDI_CONFIG_UNLOCKED = 0, // 初始配置态。

inquisiter 1430

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 617

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 207

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

bjzhang75的博客 684

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 218

ubuntu20.04屏幕亮度无法调节(亮度条调节无效)的简单靠谱解决方案及踩坑历程

0 前言   网上关于ubuntu系统亮度无法调节的问题的解决方法有很多,但是绝大部分并没有什么用(这也是我自己的亲身体会),或者并不靠谱。在遍尝各路方法过后,我终于解决了这一棘手的问题(毕竟最大亮度真的非常刺眼,无法长时间直视),在此记录一下踩坑历程以及最后的解决方案。 1 Naive方法   由于使用需要,最近在电脑原有的win10基础上安装了ubuntu双系统。我安装的是当前新版的ubuntu20.04.2.0,靠谱的安装教程可以参考这里。   之前师兄说双ssd安装双系统会有系统启动引导的问题出现,

zeeq的博客 4万+

QPrintPreviewDialog 打印预览使用实例

qt打印机预览实用demo

啊渊的专栏 3677

力扣73 矩阵置零

该解法通过标记含0的行和列来实现矩阵置零。遍历矩阵,用布尔数组记录有0的行和列;再遍历一次,若当前行或列被标记,则置为0。时间复杂度O(mn),空间复杂度O(m+n)。

Pniubi的博客 22

PLSQL Developer安装详细步骤

一、下载安装PLSQL Developer(plsql安装百度也有步骤) 官网下载地址:https://www.allroundautomations.com/registered-plsqldev/ 1、网上自己下载适合自己电脑的安装包(32或64),并解压。 2、打开解压的文件夹,得到以下三个文件(分别是汉化工具,PLSQL安装包、激活码),双击安装,如下图: 3、安装界面,点击next,进入下一步,如图: 4、安装协议界面,此处必须选择“I accept the terms in

Gorden的博客 11万+

LeetCode Hot 100 二叉树专题(三):BST 二叉搜索树与右视图(Java)

本专题主线:三题(98 / 230 / 199)共用两把钥匙——BST 的中序序列严格递增,以及遍历中的"层"与"深度"标记。看懂这两点,三题共用一套模板。 结构约定:每题统一分三部分——①题目分析与解题思路(含易错点辨析);②常见解法(附代码)及讲解;③知识点总结。

2401_88612756的博客 662

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 170

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 205

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【算法学习笔记】LeetCode 15:三数之和(排序 + 双指针)

使用sort()对数组进行排序。理解排序后双指针的移动原理。使用外层循环固定一个数字。使用左右指针寻找另外两个数字。使用continue和while实现去重。理解的执行逻辑。将三层循环优化为排序 + 双指针,使时间复杂度从 O(n³) 降低到 O(n²)。

aqiu111111的博客 158

LeetCode100 15. 三数之和

本题通过排序+双指针优化三数之和。先对数组排序,外层遍历固定第一个数,内层用左右指针查找另两个数,使三数之和为0。通过剪枝(当前数>0则终止)和去重(跳过重复元素)提升效率。相比暴力或哈希法,该方法时间复杂度为O(n²),空间O(1),更高效优雅。

Shaoxingzong的博客 323

LeetCode hot 100 — 226. 翻转二叉树 | 101. 对称二叉树

自己稀里糊涂写了一版本居然还对了,我觉得我的思想就是很简单,这里就是要交换每一个节点的左右子树,所以套用了一下之前的中序遍历的迭代套路。一直在return False,但是没有给真正的正确答案一个出口(注意递归调用中出口 / 返回值很重要,或者说是最重要的)差一步美满....用的递归的写法,差一点点就满分了,先给出自己最开始写的代码。这道题的本质是对每一个节点执行相同的操作,并且交换哪个节点在先并不重要。你可以运用递归和迭代两种方法解决这个问题吗?,翻转这棵二叉树,并返回其根节点。给你一个二叉树的根节点。

Canmido的博客 135

LeetCode2301~2320题目解析

LeetCode2301~2320题目解析

jiaomubai的博客 149

力扣3无重复字符的最长字串(滑动窗口)

该题使用滑动窗口+哈希集合优化,通过复用Set实现O(n)时间复杂度。若每轮循环都新建HashSet,虽逻辑正确,但需重复插入删除,退化为O(n²),导致超时。原解法利用窗口右移时仅移除左端旧字符、扩展右边界,避免重复操作,实现高效遍历。

Pniubi的博客 230

LeetCode 11 - 20

LeetCode 题库 11 - 20

djhws144的博客 236

LeetCodehot100+背包问题+虚拟线程

虚拟线程虽能高效利用CPU,但滥用会导致资源耗尽。错误用法中,瞬间创建1万个虚拟线程并发调用慢速下游服务,虽不占用物理线程,却引发网络连接、内存和下游服务的全面崩溃。根本原因在于虚拟线程仅缓解“等待”成本,未解决“资源”瓶颈。正确做法是在IO边界使用Semaphore限流,如设为100,控制并发数,使多余请求在堆内存中廉价挂起,保护系统稳定。虚拟线程需配合背压机制,才能真正发挥其高并发优势。

记录大学学习学习成长过程,欢迎各位一起交流 420

力扣438.找到字符串中所有字母异位词

该题通过滑动窗口与字符计数数组解决。用两个长度为26的数组 sCount 和 pCount 分别统计当前窗口和目标串 p 中各字母出现次数。初始化窗口后,若两数组相等,则记录起始位置;随后滑动窗口,左移时减去旧字符计数,右移时加上新字符计数,持续比较是否异位词。时间复杂度 O(n),空间复杂度 O(1)。

Pniubi的博客 232

LeetCode 面试经典 150_数学_阶乘后的零(133_172_C++_中等)

LeetCode 面试经典 150_数学_阶乘后的零(133_172_C++_中等) 题目描述: 给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

huayimenghan的博客 117

LeetCode //C - 1314. Matrix Block Sum

This solution computes the block sum for each element in a matrix using a 2D prefix-sum matrix. The prefix-sum matrix allows calculating the sum of any submatrix in constant time. For each element mat[i][j], the block sum is derived by adjusting the bounda

Made in Code 347
上一篇: LeetCode 热题 HOT 100 (017/100)【宇宙最简单版】
下一篇: 【汇总】测开高频面试题
CODE_RabbitV
博客等级 码龄7年 2931粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值