初学python记录:力扣1146. 快照数组

题目:

实现支持下列接口的「快照数组」- SnapshotArray:

  • SnapshotArray(int length) - 初始化一个与指定长度相等的 类数组 的数据结构。初始时,每个元素都等于 0
  • void set(index, val) - 会将指定索引 index 处的元素设置为 val
  • int snap() - 获取该数组的快照,并返回快照的编号 snap_id(快照号是调用 snap() 的总次数减去 1)。
  • int get(index, snap_id) - 根据指定的 snap_id 选择快照,并返回该快照指定索引 index 的值。

思考:

暴力解法

用一个长度为length的数组记录当前的数组值,用一个字典记录每一次快照时的数组和快照编号,代码如下:

class SnapshotArray(object):def __init__(self, length):""":type length: int"""self.array = [0 for _ in range(length)]self.snapshot = {}self.snap_time = -1def set(self, index, val):""":type index: int :type val: int:rtype: None"""self.array[index] = valdef snap(self):""":rtype: int"""self.snap_time += 1self.snapshot[self.snap_time] = list(self.array)    # 使用 list() 确保存储的是数组的副本return self.snap_timedef get(self, index, snap_id):""":type index: int:type snap_id: int:rtype: int"""return self.snapshot[snap_id][index]# Your SnapshotArray object will be instantiated and called as such:
# obj = SnapshotArray(length)
# obj.set(index,val)
# param_2 = obj.snap()
# param_3 = obj.get(index,snap_id)

提交卡在第 69 / 75 个例子,超内存了:

优化(参考灵神的题解)

不需要每次快照的时候都把数组复制下来,由于get()函数是通过给定的 snap_id 和 index 得到对应值,那我们就用一个数据结构(命名为history)记录所有(改变过值的)数组元素每次改变时的快照次数snap_time和改变后的值val,即(snap_time, val)。

这样,调用get()函数即:找到index对应的数组元素的history,在history中找到满足snap_time < snap_id条件的最后一个(snap_time, val)对,val即为所求。

问题一、history用什么数据结构?

整体用字典存储,键是每个元素的index,值是每个元素的history(用列表存储(snap_time, val)对)。

问题二、怎么在history中找到满足snap_time ≤ snap_id条件的最后一个(snap_time, val)对

因为history中的(snap_time, val)对是按照snap_time从小到大排列的,所以可以用二分查找提高效率。

代码如下:

class SnapshotArray(object):def __init__(self, length):""":type length: int"""self.history = defaultdict(list)self.cur_snap = -1def set(self, index, val):""":type index: int:type val: int:rtype: None"""# 记录(snap_time, val)对self.history[index].append([self.cur_snap, val])def snap(self):""":rtype: int"""self.cur_snap += 1return self.cur_snapdef get(self, index, snap_id):""":type index: int:type snap_id: int:rtype: int"""# 在index对应元素的history中找到满足snap_time < snap_id条件的最后一个(snap_time, val)对,val即为所求# 如果元素没有修改过,直接返回0L = self.history[index]if not L:return 0# 二分查找left = 0right = len(L) - 1ans = 0while left <= right:mid = (left + right) // 2if L[mid][0] < snap_id:ans = L[mid][1]left = mid + 1else:right = mid - 1return ans# Your SnapshotArray object will be instantiated and called as such:
# obj = SnapshotArray(length)
# obj.set(index,val)
# param_2 = obj.snap()
# param_3 = obj.get(index,snap_id)

提交通过:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国版VIX—基于上证50ETF

中国版VIX—基于上证50ETF 文章目录 中国版VIX—基于上证50ETF背景VIX与SKEW指数复现方法概要部分代码&#xff1a; 完整代码及资料可关注gzh “finance褪黑素” 回复关键字 【3003】 获取 背景 VIX指数是芝加哥期权交易所引入的用于衡量股票市场波动率的指标&#xff0c;主要…

比亚迪24届春招Offer面经

本文介绍2024届春招中&#xff0c;比亚迪的高级底盘工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了比亚迪的系统开发类、 技术研发类、 技术研究类岗位&#xff0c;面试结束后分配至高级底盘工程师岗位&#xff1b;面试前未确定部门&#xff0c;面试结束后分配至…

区块链技术与应用学习笔记(1-4节)——北大肖臻课程

目录 1. 区块链初识(课程简介&#xff09; 被过度炒作&#xff0c;落地应用有限&#xff1f; 下一代的价值互联网&#xff1f;世界上最慢的数据库&#xff1f; 2. BTC-密码学原理&#xff08;比特币&#xff09; 1)哈希 哈希函数特点 个人学习所得 2)签名 个人对于…

利用Spring Boot后端与Vue前端技术构建现代化电商平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

竞赛课第九周(埃式筛法,矩阵乘法)

1.埃式筛法:求区间[2, n]内所有的素数对 【参考代码】 #include <bits/stdc.h> using namespace std;const int N 1e5; vector<int> prime; bool visit[N];int main() {int n;cin>>n;memset(visit, false, sizeof(visit));for(int i2; i<sqrt(n); i){i…

成都百洲文化传媒有限公司电商服务如何?

在当今数字化快速发展的时代&#xff0c;电商行业日益繁荣&#xff0c;成都百洲文化传媒有限公司作为专注电商服务的领先者&#xff0c;以其独特的服务理念和创新能力&#xff0c;赢得了市场的广泛认可。本文将从公司的背景、服务特点、市场优势以及未来展望等方面&#xff0c;…

深入理解GTK、Qt、AWTK:跨平台GUI框架对比

目录标题 GTK特性&#xff1a;优点&#xff1a;缺点&#xff1a; Qt特性&#xff1a;优点&#xff1a;缺点&#xff1a; AWTK特性&#xff1a;优点&#xff1a;缺点&#xff1a; 适用场景 在当今的软件开发领域&#xff0c;图形用户界面&#xff08;GUI&#xff09;的开发是不可…

炫云云渲染:免费体验与高性价比的首选,设计师们的渲染利器

使用云渲染是要收费的&#xff0c;如果你是第一次使用&#xff0c;是可以白嫖一波云渲染的&#xff0c;所有的云渲染都会或多或少送一些渲染券&#xff0c;你可以用它们送的渲染券免费渲一波图。但是不能一直白嫖&#xff0c;再次注册账号人家就不会送体验券了&#xff0c;有些…

搭建AI知识库的终极指南

今天我们来聊聊一个挺火的话题——搭建AI知识库。你可能在想&#xff0c;这AI知识库到底是什么&#xff1f;为什么现在这么多企业都要搭建它呢&#xff1f;下面我们就一起逐步了解对AI知识库从认识到搭建的全过程。 一、什么是AI知识库 AI知识库就是一个利用人工智能技术&#…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

一文读懂海外站建设平台选择,HubSpot为何独占鳌头?

说起海外站建设平台&#xff0c;就像咱们挑餐馆一样&#xff0c;得看菜色合不合胃口&#xff0c;环境舒不舒服&#xff0c;还有价格能不能接受。市面上那些平台&#xff0c;各有各的招牌菜&#xff0c;但哪道最适合你&#xff0c;还真得好好琢磨琢磨。如果你想要的是那种既实用…

【产品经理修炼之道】- 从需求到功能的转化过程

产品经理的最大作用是将需求转化为产品或者功能&#xff0c;从需求到功能&#xff0c;会经历哪些过程&#xff1f;本文总结了从需求到功能的转化过程&#xff0c;希望对你进一步了解有所帮助。 “大部分的产品经理特别是数字化产品经理其核心价值就是如何去解决如何把需求转化为…

Azure AKS集群监控告警表达式配置

背景需求 Azure AKS集群中&#xff0c;需要对部署的服务进行监控和告警&#xff0c;需要创建并启用预警规则&#xff0c;而这里怎么去监控每个pod级别的CPU和内存&#xff0c;需要自己写搜索查询 解决方法 搜索和查询的语句如下&#xff0c;需要自己替换其中的部分信息,其中…

汽车驾驶3D模拟仿真展示系统更立体直观

随着新能源汽车的普及&#xff0c;它已成为现代生活中不可或缺的交通工具。并且国产车的崛起&#xff0c;其设计与零部件制造水平已能与合资车相媲美&#xff0c;因此汽车维修技能的学习变得尤为重要。汽车维修3D仿真教学软件应运而生&#xff0c;为广大学员提供了一个直观、高…

vLLM-prefix浅析(System Prompt,大模型推理加速)

原文&#xff1a;vLLM-prefix浅析&#xff08;System Prompt&#xff0c;大模型推理加速&#xff09; 简介 本文浅析了在大模型推理加速方面一个非常优秀的项目 vLLM 的一个新特性 Prefix。在 Prompt 中有相同前缀时可以提高吞吐量降低延迟&#xff0c;换句话说可以省去这部分…

解线性方程组——上三角、下三角,回代算法 | 北太天元

1. 解上三角(回代) a i i ≠ 0 a_{ii\neq0} aii0​ , i 1 , 2 , … , n i1,2,\ldots,n i1,2,…,n a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ a n n x n b n \begin{aligned} a_{11}x_1a_{12}x_2\cdotsa_{1n}x_n&b_1 \\ a_{22}x_2\cdot…

解决idea不识别${pageContext.request.contextPath}的方法

文章目录 一、产生原因二、解决方法——直接修改web.xml文件三、修改模板——找到web.xml模板&#xff0c;修改替换 一、产生原因 由于web.xml 使用的web-app版本号过低。导致无法识别"{pageContext.request.contextPath}"。 IDEA在创建javaweb项目的时候&#xff0…

synchronized 之谜

序言 本文给大家介绍一下 synchronized 关键字的部分原理。 一、内存中的 Java 对象 class A {private String attr; }先引入一个问题&#xff1a;上面类 A 有一个属性 attr。当类 A 实例化之后的对象在内存中是如何表示的呢&#xff1f; 在内存中&#xff0c;Java 对象由三…

2024年03月CCF-GESP编程能力等级认证Python编程二级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共15题,共30分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是? A.小程序 B.计时器 C.操作系统 D.神话人物 答案…

【Linux驱动层】iTOP-RK3568学习之路(三):字符设备驱动框架

一、总体框架图 二、字符设备相关函数 静态申请设备号 register_chrdev_region 函数原型&#xff1a;register_chrdev_region(dev_t from, unsigned count, const char *name) 函数作用&#xff1a;静态申请设备号&#xff0c;可以一次性申请多个连续的号&#xff0c;count指定…