# Solving Leetcode Interviews in Seconds with AI: Snapshot Array


	# Introduction
	In this blog post, we will explore how to solve the LeetCode problem "1146" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like [Chatmagic](https://www.chatmagic.app), we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

	# Problem Statement
	> Implement a SnapshotArray that supports the following interface:  SnapshotArray(int length) initializes an array-like data structure with the given length. Initially, each element equals 0. void set(index, val) sets the element at the given index to be equal to val. int snap() takes a snapshot of the array and returns the snap_id: the total number of times we called snap() minus 1. int get(index, snap_id) returns the value at the given index, at the time we took the snapshot with the given snap_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   Constraints:  1 <= length <= 5 * 104 0 <= index < length 0 <= val <= 109 0 <= snap_id < (the total number of times we call snap()) At most 5 * 104 calls will be made to set, snap, and get.  

	# Explanation
	Here's a breakdown of the approach, complexity, and the Python code for the `SnapshotArray` implementation:

*   **Key Idea:** Instead of storing the entire array for each snapshot, store only the changes (index, value) with the corresponding `snap_id`. This is done using a list of (snap\_id, value) pairs for each index. When `get(index, snap_id)` is called, perform a binary search to find the most recent value at that index at or before the given `snap_id`.
*   **Efficiency:** This approach efficiently handles scenarios where changes are sparse. Many values will remain at their initial value of 0, and only changed values will be stored with their corresponding snapshot ID.
*   **Snapshot ID Management:** The `snap_id` is simply a counter that increments each time `snap()` is called.

*   **Complexity:**
    *   Runtime: `set`: O(1), `snap`: O(1), `get`: O(log S), where S is the number of snapshots in which the particular index was modified.
    *   Storage: O(N \* S), where N is the length of the array and S is the total number of snapshots. In the worst-case scenario, where every element is modified in every snapshot. However, in most realistic scenarios where modifications are sparse, the actual space usage will be much less.

	
	# Code
	```python
	class SnapshotArray:

    def __init__(self, length: int):
        self.history = [[] for _ in range(length)]
        self.snap_id = 0

    def set(self, index: int, val: int) -> None:
        if not self.history[index] or self.history[index][-1][0] != self.snap_id:
            self.history[index].append((self.snap_id, val))
        else:
            self.history[index][-1] = (self.snap_id, val) #Update if already set in this snap

    def snap(self) -> int:
        self.snap_id += 1
        return self.snap_id - 1

    def get(self, index: int, snap_id: int) -> int:
        arr = self.history[index]
        if not arr:
            return 0

        l, r = 0, len(arr) - 1
        ans = 0

        while l <= r:
            mid = (l + r) // 2
            if arr[mid][0] <= snap_id:
                ans = arr[mid][1]
                l = mid + 1
            else:
                r = mid - 1
        
        return ans
	```
			
