(语法笔记 分析题解语法 二分 “unordered_map与vector<pair<>>“ 快速数组)leetocde 1146

*注:代码和题解思路来源于灵茶山艾府,因为我之前未接触过vector<pair<>>与map的联合使用才写的笔记 链接: 灵茶山艾府题解

核心思路:建立 unordered_map<int, vector<pair<int, int>>> history; 令key为下标 vector存放不同快照引索的值,详看下文的输出

unordered_map<int, vector<pair<int, int>>> history;

键:int

值:vector<pair<int, int>>

history[0] 会访问 history 中键为 0 所对应的 std::vector<std::pair<int, int>>。如果该键不存在,会自动创建一个空的 vector。

// 正确访问方式

if (!history[0].empty()) {

int firstValue = history[0][0].first; 10

int secondValue = history[0][0].second; 20

}

在代码里,使用 history[0].emplace_back(10, 20); 向 history 中键为 0 对应的 vector 里"插入"了一个 std::pair<int, int> 对象,其值为 (10, 20)。

emplace_back(10, 20) 会在这个 vector 的末尾直接构造一个 std::pair<int, int> 对象,这个对象的第一个元素是 10,第二个元素是 20。

history[0].emplace_back(10, 20);

history[0].emplace_back(30, 40);

history[1].emplace_back(50, 60);

unordered_map数组的状态

key=index是下标题目说的下标

Key: 0

(10, 20)history[key][0] history[index][0].first**--10快照索引****history[index][0].second--**20

(30, 40)history[key][0]

Key: 1

(50, 60)

代码分析:

int j = ranges::lower_bound(h, pair(snap_id + 1, 0)) - h.begin() - 1;

中 pair(snap_id + 1, 0)

假设 h 中有如下元素:

std::vector<std::pair<int, int>> h = { {10, 20}, {30, 40}, {50, 60} };

若 snap_id 为 20,那么 std::pair(snap_id + 1, 0) 就是 std::pair(21, 0)。

std::ranges::lower_bound 算法会依据 std::pair 的第一个元素进行比较,找到第一个大于等于 21 的元素,也就是 (30, 40)。

在这个过程中,std::pair 的第二个元素 0 并不影响查找结果,它只是占位,保证 std::pair 类型的完整性。

cpp 复制代码
class SnapshotArray {
   unordered_map<int,vector<pair<int, int>>> history; 
    int c_snap_id=0;
public:
    SnapshotArray(int length) {
    }
    
    void set(int index, int val) {
        history[index].emplace_back(c_snap_id,val);
    }
    
    int snap() {
        return c_snap_id++;
    }
    
    int get(int index, int snap_id) {
        auto &h=history[index];
        int j=ranges::lower_bound(h,pair(snap_id+1,0))-h.begin()-1;
        return j>=0?h[j].second: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);
 */
相关推荐
打野赵怀真2 分钟前
前端资源发布路径怎么实现非覆盖式发布(平滑升级)?
前端·javascript
编程绿豆侠2 分钟前
力扣HOT100之双指针:11. 盛最多水的容器
算法·leetcode·职场和发展
JANGHIGH2 分钟前
c++ constraints与concepts使用笔记
c++·笔记
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧7 分钟前
C语言_数据结构总结4:不带头结点的单链表
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
顾林海11 分钟前
Flutter Dart 流程控制语句详解
android·前端·flutter
tech_zjf12 分钟前
装饰器:给你的代码穿上品如的衣服
前端·typescript·代码规范
xiejianxin52013 分钟前
如何封装axios和取消重复请求
前端·javascript
parade岁月14 分钟前
从学习ts的三斜线指令到项目中声明类型的最佳实践
前端·javascript
狼性书生16 分钟前
electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信
前端·javascript·electron
阿里巴巴P8资深技术专家16 分钟前
使用vue3.0+electron搭建桌面应用并打包exe
前端·javascript·vue.js