力扣1146 快照数组

ops/2024/11/19 13:18:58/

思路:初始时,使用的思路是对于每个快照的数组都进行一次副本保存,但是提交后是时间超出。因此基于 灵神. - 力扣(LeetCode) 的思路不构建数组,而是保存每个数组位置set的记录,记录采用的是键值对的形式,键为当前快照号,值为传递过来需要修改的val;这样构造函数、set以及snap方法都可以比较精简的得到解决。

对于get方法,若没有构建数组存储每个时刻的数据而是直接记录版本更新情况的话,在二分查找时所检索的不是等于当前snap_id的记录,而是需要找到索引list中小于snap_id的第一个元素(因为同一个index出,可以有多个快照号相同的记录);因此二分查找使用红蓝染色法,返回left。

class SnapshotArray {// 快照编号int snapidx;Map<Integer, List<int[]>> map = new HashMap<>();public SnapshotArray(int length) {// 定位快照编号snapidx = 0;// arr = new int[length];// 构建map,提前为每个索引建立好历史记录列表for(int i=0; i<length; i++){List<int[]> list = new ArrayList<>();map.put(i, list);}}public void set(int index, int val) {// 当前版本的数据更新// arr[index] = val;// 增加一条记录List<int[]> list = map.get(index);list.add(new int[]{snapidx, val});  // list内加入的元素总是按照时间的先后往其中加入的map.put(index, list);}public int snap() {snapidx++;return snapidx-1;}public int get(int index, int snap_id) {// 获取到当前的索引位置的历史版本List<int[]> list = map.get(index);// 本质上可以通过遍历来实现,使用二分查找加快查找的速度int idx = binarysearch(list, snap_id);return idx<0? 0:list.get(idx)[1];}public int binarysearch(List<int[]> list, int snapid){// 红蓝染色法的二分查找int left = -1;int right = list.size();while(left + 1 != right){int mid = left + (right-left)/2;if(list.get(mid)[0] <= snapid)left = mid;elseright = mid;}return left;}
}/*** 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);*/


http://www.ppmy.cn/ops/17289.html

相关文章

Mysql个人复习总结

最近想把mysql的知识点再过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写的如下几篇博客,这篇不再赘述,阅读顺序由浅入深依次递进。 一、MySQL 概述 数据库&表操作 数据增删改; 二、MySQL 单表查询 …

JS实现对用户名、密码进行正则表达式判断,按钮绑定多个事件,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

C++ vs Rust vs Go性能

比较 C、Rust 和 Go 的性能涉及许多因素&#xff0c;包括编程语言本身的特性、编译器优化、代码实现方式等。我将提供一个简单的代码示例&#xff0c;演示如何使用这三种语言编写一个简单的计算斐波那契数列的程序&#xff0c;并在每种语言下进行性能比较。 C 代码示例&#x…

8点法估计基础矩阵

估计基础矩阵 文章目录 估计基础矩阵8点法归一化 8点法 8点法 根据两幅图像中8个对应点对之间的关系&#xff0c;采用SVD求 解最小二乘方 约束&#xff1a;det(F) 0 假设已知N对点的对应关系&#xff1a; { x i , x i ′ } i 1 N \{x_i,x^{\prime}_i\}_{i1}^N {xi​,xi′​…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中&#xff0c;源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据&#xff0c;并且转置列表示i第几个batchbptt 15 #超参数&#xff0c;一次输入多少个ba…

AI论文速读 |2024[TPAMI]【综述】自监督学习在时间序列分析的分类、进展与展望

题目&#xff1a; Self-Supervised Learning for Time Series Analysis: Taxonomy, Progress, and Prospects 作者&#xff1a;Kexin Zhang, Qingsong Wen(文青松), Chaoli Zhang, Rongyao Cai, Ming Jin(金明), Yong Liu(刘勇), James Zhang, Yuxuan Liang(梁宇轩), Guansong…

docker-MySQL 8 主从搭建

一.目录结构&#xff1a; 我是在/home目录下&#xff0c;建立个sql文件夹&#xff1a; 二、配置文件 1.mysql配置 mysql-master下.conf文件配置 ###### [mysqld] server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…

Linux bond0 配置方法

Centos7 配置文件 关闭 NetworkManager systemctl stop NetworkManager systemctl disable NetworkManager修改网卡配置文件 bond0 配置文件 cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICEbond0 ONBOOTyes IPADDR192.168.0.100 NETMASK255.255.255.0 GATEWAY192.…