【每日一题】1146. 快照数组

1146. 快照数组 - 力扣(LeetCode)

实现支持下列接口的「快照数组」- 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 的值。

示例:

输入:["SnapshotArray","set","snap","set","get"][[3],[0,5],[],[0,6],[0,0]]
输出:[null,null,0,null,5]
解释:
SnapshotArray snapshotArr = new SnapshotArray(3); // 初始化一个长度为 3 的快照数组
snapshotArr.set(0,5);  // 令 array[0] = 5
snapshotArr.snap();  // 获取快照,返回 snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0);  // 获取 snap_id = 0 的快照中 array[0] 的值,返回 5

提示:

  • 1 <= length <= 50000
  • 题目最多进行
  • 0 <= snap_id < 我们调用 snap() 的总次数
  • 0 <= val <= 10^9
class SnapshotArray {HashMap<Integer,HashMap<Integer, Integer>> map = new HashMap<Integer,HashMap<Integer, Integer>>();int count = 0;public SnapshotArray(int length) {map.clear();HashMap<Integer,Integer> tmp = new HashMap<Integer,Integer>();map.put(count,tmp);}public void set(int index, int val) {if(map.containsKey(count)) {map.get(count).put(index,val);} else {int num = count-1;HashMap<Integer,Integer> tmp2 = map.get(num);while(tmp2 == null) {num--;tmp2=map.get(num);}HashMap<Integer,Integer> tmp;tmp = (HashMap<Integer,Integer>)tmp2.clone();tmp.put(index,val);map.put(count,tmp);}}public int snap() {count++;return count-1;}public int get(int index, int snap_id) {int num = snap_id;HashMap<Integer,Integer> tmp = map.get(num);while(tmp == null) {num--;tmp = map.get(num);}if(tmp.containsKey(index)) {return tmp.get(index);} else {return 0;}}
}/*** Your SnapshotArray object will be instantiated and called as such:* SnapshotArray obj = new SnapshotArray(length);* obj.set(index,val);* int param_2 = obj.snap();* int param_3 = obj.get(index,snap_id);*/

         每日一题,今天是中等题。今天这道题其实博主本人只是用了模拟的方法,熟悉Java的数据结构后去调用api而已。大家可以去题解看看更好的解法,博主这里只作为参考,当无法更快的时候,更重要的是先解出题目。(个人看法)

        首先,读题。跟昨天的题目实际上差不多,要求实现一个接口。其中含有SnapshotArray,初始化函数,get,set方法,以及snap的快照方法。题目所说的快照实际上就是所给snap_id时间点的数组状态。博主这里使用hashmap来映射snap和数组状态。这样使用就只需要直接去调api就可以了。用一个count来记录调用了几次snap,也就是存了几次快照。初始化时,可以先创建一个hashmap。对应的最开始的时候的数组。(这里主要是让后面可以直接根据这里的hashmap来clone)。

        set的时候需要先判断,是否是新的count,因为新的count说明之前的数组状态已经定格了,也就是就算之后再改变同个位置的值,也需要返回旧数组状态的值。如果是新的,要先clone旧的,在新的中再去更新,并更新map中的(count,hashmap)对。不一定每一次都有新的值要放入,如果没有新的值需要放入,即便这时候拍快照也意味着和之前的状态是一样的,所以可以直接一直往前找,直到找到对应最近的快照,再clone。

        get的时候一样,假如需要的snap_id对应的hashmap为空,说明是没有变化的,往前找到最近的不为空的hashmap就可以了,如果没有对应的键,说明没有修改过,需要返回0。

        这样这道题就可以解决了。

        其实这里使用到了时间换空间的方法,假如对于每个count都去创建hashmap的话,到后面就会出现内存不够的错误,观察到数量级只有50000次,就可以用时间换空间的方法,用循环往前找就可以了。

结果如下:

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

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

相关文章

【去除若依首页】有些小项目不需要首页,去除方法

第一步 // // // // // // // // // // // // // // // // // // 修改登录页 Login.vue 中 大概144行 &#xff0c;注释掉原有跳转。替换为自己的跳转路径 // // // // // // // // // // // // // this.$router.push({ path: this.redirect || …

linux 设置打开文件数

可以使用下面的文件进行设置 /etc/security/limits.d/90-nproc.conf 先来看/etc/security/limits.d/90-nproc.conf 配置文件&#xff1a; [root ~]# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of users processes to prevent # accidental fork…

TikTok矩阵玩法:如何最大程度地利用平台资源

在数字时代&#xff0c;TikTok已经成为全球范围内数亿用户的创意天堂&#xff0c;不仅仅是一个娱乐平台&#xff0c;还是一个创收的宝地。 TikTok矩阵玩法的崛起正在引领创作者们探索全新的变现方案&#xff0c;他们通过巧妙地利用平台资源&#xff0c;实现了前所未有的创收机…

李宏毅hw-6利用GAN生成动漫图像

一、查漏补缺、熟能生巧&#xff1a; 1.什么是转置卷积convTranspose、以及这种转置卷积怎么使用&#xff1a; &#xff08;1&#xff09;具体的原理直接看李沐老师的那个演示&#xff0c;非常清晰&#xff1a; 47 转置卷积【动手学深度学习v2】_哔哩哔哩_bilibili &#x…

从字符串中删除指定字符

任务描述 编写一个函数实现功能&#xff1a;从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如&#xff1a;程序执行时输入字符串&#xff1a;turbo c and Borland c&#xff0c;从键盘输入字符n&#xff0c;则输出后变为&#xff1a;turbo c ad Borlad c。如…

【Java】全套云HIS(医院信息管理系统)源码包含EMR、LIS

云HIS系统简介 SaaS模式Java版云HIS系统源码&#xff0c;在公立二甲医院应用三年&#xff0c;经过多年持续优化和打磨&#xff0c;系统运行稳定、功能齐全&#xff0c;界面布局合理、操作简便。 1、融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病…

爬虫 — 验证码反爬

目录 一、超级鹰二、图片验证模拟登录1、页面分析1.1、模拟用户正常登录流程1.2、识别图片里面的文字 2、代码实现 三、滑块模拟登录1、页面分析2、代码实现&#xff08;通过对比像素获取缺口位置&#xff09; 四、openCV1、简介2、代码3、案例 五、selenium 反爬六、百度智能云…

中央处理器(408)

一、基本结构 【2010统考】下列寄存器中&#xff0c;汇编语言程序员可见的是&#xff08;B&#xff09; A、MAR B、PC C、MDR D、IR 解析&#xff1a;IR、MAR、MDR是内部工作寄存器&#xff0c;对程序员不可见 可见&#xff1a;通用寄存器、程序状态字…

概率统计笔记:从韦恩图的角度区分 条件概率和联合概率

联合概率&#xff1a;两个或多个事件同时发生的概率。用 P(A∩B) 或 P(A,B) 表示 条件概率&#xff1a;在已知某个事件发生的条件下&#xff0c;另一个事件发生的概率。用P(A∣B) 表示在事件 B 发生的条件下&#xff0c;事件 A 发生的概率。 不难发现联合概率的样本空间更大&am…

NODEJS版本管理工具

一、使用NVM 下载 Linux下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh widows下载地址 https://github.com/coreybutler/nvm-windows/releases 安装Node.js版本&#xff1a; nvm install 14.16.0 切换Node.js版本&#xff1a; nvm use …

关键节点与邻居搜索:K-Core算法对比K-Hop算法的效能较量

文章首发地址 K-Core算法 K-Core算法是一种网络分析算法&#xff0c;用于发现网络中的核心节点。核心节点是指在网络中具有重要影响力的节点&#xff0c;它们连接着大量其他节点&#xff0c;是网络中的重要信息传播和控制中心。K-Core算法通过逐步删除网络中度小于K的节点&am…

基于Java的高校宣讲会管理系统设计与实现(亮点:选题新颖、功能实用、老师看见直接过!)

高校宣讲会管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前…

Ubuntu22.04开启后屏幕黄屏

1. 故障现象 系统&#xff1a;Ubuntu22.04 现象&#xff1a;电脑从开机到进入桌面一直屏幕黄屏 2. 故障分析 可能为屏幕色彩调节出现故障 3. 解决方案 系统设置——》色彩——》删除原来的配置&#xff08;remove profile&#xff09;——》添加配置Colorspace:Compatibl…

加速乐源码(golang版本)

一、分析 分析过程网上有很多,这里只说个大概,主要是提供golang源码 请求网站,发现前两次请求都会返回521,第三次请求成功,说明前两次请求肯定是干了什么事情;使用接口请求工具模拟请求分析该过程 使用postman工具请求 a. 第一次请求会在响应头返回jsluid,返回内容中拼接…

MyBatis面试题(二)

文章目录 前言一、MyBatis 与 Hibernate 有哪些不同&#xff1f;二、MyBatis 的好处是什么&#xff1f;三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系&#xff1f;四、什么是 MyBatis 的接口绑定,有什么好处&#xff1f;五、接口绑定有几种实现方式,…

华为OD机试 - 流水线 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

Linux:IP转INT详解

一、IP地址介绍 IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;是所有连接到网络设备的唯一标识符。IP地址由32位二进制数表示&#xff0c;通常以四段十进制数&#xff08;每个数值范围为0-255&#xff09;表示&#xff0c;例如192.1…

提升前端开发效率:基于vue的van-radio-group组件封装指南

前言 vant 作为一款流行的 ui 框架&#xff0c;其中&#xff0c;van-radio-group 组件是一个常用的单选框组件&#xff0c;但有时我们需要根据项目需求进行定制化封装。本文将介绍如何基于 vue 框架封装 van-radio-group 组件&#xff0c;让我们一起来探索吧&#xff01; 封装文…

Python-模块

python模块&#xff08;Module&#xff09;&#xff0c;是一个python 文件&#xff0c;以.py结尾&#xff0c;模块可以定义函数&#xff0c;类和变量。 模块的导入方法 [from 模块名 ] import [模块 | 类 | 变量 | 函数 | *] [as 别名 ] import模块名 import timetime.sleep(…

EFK代替ELK方案7.17.3

文章目录 一. 传统的ELK二. EFK2.1 安装elasticSearch2.2 服务端安装fileBeats2.2.1. 安装 该也没有必要安装odcker,直接下载yum或官网jar包启动即可.2.2.2.编辑配置文件 filebeat-java-logback.yml2.2.3. es配置common_log_pipeline解析日志 三.启动测试 最近发现,logstash日志…