2024.4.26力扣每日一题——快照数组

2024.4.26

      • 题目来源
      • 我的题解
        • 方法一 TreeMap
        • 方法二 哈希表+二分法

题目来源

力扣每日一题;题序:1146

我的题解

方法一 TreeMap

使用TreeMap记录每个snip_id下的修改记录。
在set时,判断snip_id下是否有修改记录,若无则将最后一次有修改记录的snip_id下的修改记录复制给当前的snip_id,然后再添加新的修改记录。
在snap时只需要直接snip_id+1
在get时,从snip_id开始遍历,依次减1,找到最后一次index修改的记录。

时间复杂度:初始化、snap 均为 O(1),set为O(logn),get 为 O(h+k),h是查找快照ID时需要遍历的层数(从snap_id到0),k是找到特定索引的值所需的映射查找次数。在最坏的情况下,如果每次快照都修改了该索引,那么k可以是等于快照数量的。但是,如果快照修改不是那么频繁,这个值会小得多。
空间复杂度:除了初始化基本都是O(1)

class SnapshotArray {TreeMap<Integer,Map<Integer,Integer>> map;int[] arr;int count;int len;public SnapshotArray(int length) {map=new TreeMap<>();arr=new int[length];count=0;len=length;map.put(0,new HashMap<>());}public void set(int index, int val) {if(!map.containsKey(count)&&count!=0)map.put(count,new HashMap<>(map.get(map.lastKey())));Map<Integer,Integer> change=map.get(count);change.put(index,val);map.put(count,change);}public int snap() {return count++;}public int get(int index, int snap_id) {int res=arr[index];for(int i=snap_id;i>=0;i--){if(map.containsKey(i)&&map.get(i).containsKey(index)){res=map.get(i).get(index);break;}}return res;}
}
方法二 哈希表+二分法

参照灵神的代码

时间复杂度:初始化、set、snap 均为 O(1),get为 O(log⁡q),其中 q 为 set 的调用次数。
空间复杂度:O(q)

class SnapshotArray {// 当前快照编号,初始值为 0private int curSnapId;// 每个 index 的历史修改记录private final Map<Integer, List<int[]>> history = new HashMap<>();public SnapshotArray(int length) {}public void set(int index, int val) {history.computeIfAbsent(index, k -> new ArrayList<>()).add(new int[]{curSnapId, val});}public int snap() {return curSnapId++;}public int get(int index, int snapId) {if (!history.containsKey(index)) {return 0;}List<int[]> h = history.get(index);int j = search(h, snapId);return j < 0 ? 0 : h.get(j)[1];}// 返回最大的下标 i,满足 h[i][0] <= x// 如果不存在则返回 -1private int search(List<int[]> h, int x) {// 开区间 (left, right)int left = -1;int right = h.size();while (left + 1 < right) { // 区间不为空// 循环不变量:// h[left][0] <= x// h[right][1] > xint mid = left + (right - left) / 2;if (h.get(mid)[0] <= x) {left = mid; // 区间缩小为 (mid, right)} else {right = mid; // 区间缩小为 (left, mid)}}// 根据循环不变量,此时 h[left][0] <= x 且 h[left+1][0] = h[right][0] > x// 所以 left 是最大的满足 h[left][0] <= x 的下标// 如果不存在,则 left 为其初始值 -1return left;}
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

rabbitmq集群配置

1&#xff0c;配置环境变量 MY_POD_NAME&#xff1a;当前Pod的名称 RABBITMQ_ERLANG_COOKIE&#xff1a;设置Erlang Cookie用于节点间通信安全验证&#xff0c;值来自/nfs/rabbitmq/lib/.erlang.cookie文件内容 RABBITMQ_NODENAME&#xff1a;根据Pod名称动态生成了RabbitMQ…

【GO】命令行解析 os 与 flag

目录 OS解析命令 简单用法 进阶用法 flag命令解析 基础实例 1. 自定义数据类型 2. 创建多个 FlagSet 3. 整合环境变量和配置文件 os与flag 关键点解析 程序的作用 示例命令行调用 在 Go 语言中&#xff0c;命令行解析是一项基本且常用的功能&#xff0c;它允许开发者…

微信小程序简单实现购物车功能

微信小程序简单实现购物车结算和购物车列表展示功能 实现在微信小程序中对每一个购物车界面的商品订单&#xff0c;进行勾选结算和取消结算的功能&#xff0c;相关界面截图如下&#xff1a; 具体实现示例代码为&#xff1a; 1、js代码&#xff1a; Page({/*** 页面的初始数…

K8s: 公有镜像中心和私有镜像中心的搭建

公有镜像中心的搭建和使用 1 &#xff09;在 官方docker镜像中心推送 在 hub.docker.com 上注册账号 (国内一般访问不了&#xff0c;原因不多说) 找到 Create Repository 按钮就行仓库的创建 这样就在官方创建了一个仓库&#xff0c;比如地址为: xx/y-y xx 是我的账户名y-y 是…

【早晨读书会】深入理解rust并发编程

第一章 线程 线程 线程是调度的最小单位 同一进程中的多条线程将共享该进程中的全部系统资源&#xff0c;如虚拟地址空间&#xff0c;文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈&#xff08;call stack&#xff09;&#xff0c;自己的寄存器上下文&am…

数之寻软件怎么样?

数之寻软件是一款功能强大的数据恢复和备份软件&#xff0c;以下是对其特点和功能的详细评价&#xff1a; 一、数据恢复方面&#xff1a; 高效的数据恢复能力&#xff1a;数之寻软件采用了先进的算法和数据恢复技术&#xff0c;能够快速有效地恢复丢失或损坏的数据。无论是文…

Python中matplotlib将多张遥感影像绘制为多个子图并分别设定子图标题的方法

本文介绍基于Python语言的matplotlib模块与gdal模块&#xff0c;读取大量长时间序列遥感影像&#xff0c;分别将其不同时相的图像作为子图&#xff0c;绘制在1个完整的大图中&#xff0c;并分别为每1个子图构建、显示标题的方法。 首先&#xff0c;我们明确一下本文的需求。现有…

Hadoop之路

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;有的命令一…

Web前端一套全部清晰 ② day2 HTML 标签之文字排版,图片、链接、音视频链接

虽然辛苦&#xff0c;我还是会选择那种滚烫的人生 —— 24.4.25 HTML初体验 1.HTML定义 HTML 超文本标记语言 超文本 —— 链接 标记 —— 标记也叫标签&#xff0c;带尖括号的文本 标签语法 开始标签 需要加粗的文字 结束标签 标签成对出现&#xff0c;中间包裹内容 <>里…

Rabbitmq消息应答,持久化,权重分配(7)

消息应答 概览 消息应答机制是 RabbitMQ 中确保消息处理的可靠性和一致性的重要机制之一。当消费者从队列中接收到消息并处理完成后&#xff0c;通常需要向 RabbitMQ 发送一个明确的消息应答&#xff0c;以告知 RabbitMQ 消息已经被处理&#xff0c;并可以安全地从队列中移除…

如何消除浏览器SmartScreen对网站“不安全”提示?

面对互联网时代用户对网站安全性和可信度的严苛要求&#xff0c;网站运营者时常遭遇Microsoft Defender SmartScreen&#xff08;SmartScreen&#xff09;提示网站不安全的困扰。本文将剖析SmartScreen判定网站不安全的原因&#xff0c;并为运营者提供应对策略&#xff0c;以恢…

Android常用开源库所使用的设计模式有哪些?

1. OkHttp 1&#xff09;构造者模式。 构建不同的Request对象。 2&#xff09;工厂模式 。 通过OkHttpClient生产出产品RealCall。 3&#xff09;观察者模式。OkHttp 的某些组件可能使用观察者模式来监听和响应事件&#xff0c;如连接状态的变化或请求的完成。 4&#xff0…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

ip https证书360

https证书主要作用是保障网络安全&#xff0c;在http协议的基础上通过SSL/TLS加密技术实现安全通信协议。对客户端以及服务器之间的传输数据进行加密&#xff0c;确保数据的完整性和机密性&#xff0c;维护用户隐私。通过HTTPS协议&#xff0c;我们可以安全地进行在线购物、网上…

【threejs教程7】threejs聚光灯、摄影机灯和汽车运动效果

【图片完整效果代码位于文章末】 在上一篇文章中我们实现了汽车模型的加载&#xff0c;这篇文章主要讲如何让汽车看起来像在运动。同时列出聚光灯和摄像机灯光的加载方法。 查看上一篇&#x1f449;【threejs教程6】threejs加载glb模型文件&#xff08;小米su7&#xff09;&…

python——处理excel的常用库

Python 处理 Excel 文件主要依赖于几个流行的第三方库&#xff0c;这些库提供了丰富的功能来读取、写入以及操作 Excel 文件。以下是几种常见的处理方式&#xff1a; pandas: 安装: pip install pandas openpyxl&#xff08;或pip install pandas xlrd xlwt&#xff0c;取决于E…

Kubernetes学习-核心概念篇(一) 初识Kubernetes

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是Kubernetes 3. 为什么需要Kubernetes 3.1. 应…

【高校科研前沿】东北地理所在遥感领域顶刊RSE发布中国主要红树植物群落遥感分类成果

目录 01 文章简介 02 研究内容 03 文章引用 01 文章简介 论文名称&#xff1a;Mangrove species mapping in coastal China using synthesized Sentinel-2 high-separability images&#xff08;基于Sentinel-2高分离度图像的中国沿海红树群落制图&#xff09; 第一作者及…

口才培训需要多久才能看到成效?

口才培训需要多久才能看到成效&#xff1f; 口才培训需要多久才能看到成效&#xff0c;这个问题的答案因个体差异而异&#xff0c;受到多种因素的影响。以下是对此问题的详细分析&#xff1a; 首先&#xff0c;每个人的口才基础和学习能力不同。有些人可能天生具备良好的口才…

面试C++(基础篇)- C++是如何工作的?

1:C是如何工作的&#xff1f; 首先以一个最简单的Hello word程序入门来看&#xff1a; #include <iostream>int main() {std::cout << "Hello World!\n"<< std::endl;std::cin.get(); }1&#xff1a;#include是预编译命令&#xff0c;发生在编译…