Re: [閒聊] 每日LeetCode

作者: Rushia (みけねこ的鼻屎)   2023-06-11 21:45:11
https://leetcode.com/problems/snapshot-array/description/
1146. Snapshot Array
設計一個支持快照的陣列,他有以下介面:
SnapshotArray(int length) 初始化陣列大小,預設所有元素為0。
void set(index, val) 設置 陣列[index] = val
int snap() 將當前陣列的狀態保存成一個快照,返回值是快照id,值為快照次數-1。
int get(index, snap_id) 返回該快照id下陣列的值。
Example 1:
Input: ["SnapshotArray","set","snap","set","get"]
[[3],[0,5],[],[0,6],[0,0]]
Output: [null,null,0,null,5]
Explanation:
SnapshotArray snapshotArr = new SnapshotArray(3); // set the length to be 3
snapshotArr.set(0,5); // Set array[0] = 5
snapshotArr.snap(); // Take a snapshot, return snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0); // Get the value of array[0] with snap_id = 0, return 5
思路:
1.因為陣列必須保存修改之前的狀態,所以我們在更改和設置陣列的值時,需要帶上版本
號資訊(快照id),先將陣列初始化為快照id和值都為0的陣列。
2.set的時候判斷如果index位置的版本和當前相同就直接改,否則插入一個新的版本。
3.get的時候只需要把index的所有版本號拿出來並找出版本和snap_id相同的值即可,如果
不存在相同的就返回舊的版本(例如:snap_id=5 但是只有4那就返回4),因為我們在set
元素的時候必定是按照順序插入的,所以版本號可以用二分搜索去抓出來。
4.snap只要更新快照次數就好。
Java Code:
作者: JIWP (JIWP)   2022-06-11 21:45:00
大師
作者: wwndbk (黑人問號)   2023-06-11 21:46:00
大師
作者: Che31128 (justjoke)   2023-06-11 21:48:00
大師
作者: DDFox (冒險者兼清潔工)   2023-06-11 21:52:00
大師

Links booklink

Contact Us: admin [ a t ] ucptt.com