다음과 같은 인터페이스를 지원하는 SnapshotArray 구현 :
SnapshotArray(int length)
지정된 길이 배열 형 데이터 구조를 초기화한다. 처음에는 각 요소는 0과 같다.void set(index, val)
소정의 요소를 설정하는 단계index
와 같아야한다val
.int snap()
배열의 스냅 샷을하고 반환snap_id
: 시간의 총 수는 우리가라는snap()
마이너스1
.int get(index, snap_id)
주어진에서 값을 반환index
우리는 주어진과 스냅 샷을 걸린 시간에,snap_id
예 1 :
입력 : [ "SnapshotArray", "세트", "스냅", "세트", "GET"] [3], [0,5], [] [0,6], [0,0] 출력 [NULL, 0, 널, 널 1,5] 설명 : SnapshotArray snapshotArr = 새로운 SnapshotArray (3); 3가되도록 길이를 설정 // snapshotArr.set (0,5); // 세트 어레이 [0] = 5 snapshotArr.snap을 (); // 스냅 샷을 가지고 snap_id = 0 반환 (0,6)을 snapshotArr.set을; snapshotArr.get (0,0); // snap_id = 0 어레이 [0]의 값을 취득 5 반환
分析: https://leetcode.com/problems/snapshot-array/을
아이디어는 전체 배열이 클 수있다, 우리는 시간의 스냅 톤이 걸릴 수 있습니다. 대신 레코드의 전체 배열의 역사, 우리는 각 셀의 역사를 기록합니다. 그리고 이것은 우리가 모든 정보를 기록하는 데 필요한 최소 공간입니다. 각 A [i]를 위해, 우리는 역사를 기록합니다. snap_id하고 그 값으로. 우리가 역사에서 가치를 얻을하려는 경우, 단지 진 시점을 검색 할 수 있습니다.
복잡성 시간
SnapshotArray (INT 길이) O (N) 시간
세트 (INT 지수, INT의 발)이 O 인 (logSnap)
스냅 () O (1)
수 (INT 지수, INT의 snap_id)은 O입니다 (logSnap)
1 급 SnapshotArray { 2- 트리 맵 <정수 정수> []을; 3 INT snap_id = 0 ; 4 공개 SnapshotArray ( INT의 길이) { 5 A = 새 트리 맵 [길이]; 도 6 에 대해 ( int로 I = 0 ; I <길이; 내가 ++ ) { 7 A [I] = 새로운 트리 맵 <정수 정수> (); 8 A [i]를 .put ( 0 , 0 ); 9 } 10 } 11 12 공중 공극 세트 ( INT의 인덱스, INT의 발) { 13 A [인덱스] .put (snap_id, 발); 14 } 15 16 공중 INT의 스냅 () { 17 반환 ++ snap_id ; 18 } 19 20 공중 INT의 GET ( INT의 인덱스 의 INT snap_id) { 21 반환 A [인덱스] .floorEntry (snap_id) .getValue (); 22 } 23 }