스냅 샷 배열

다음과 같은 인터페이스를 지원하는 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 }

 

추천

출처www.cnblogs.com/beiyeqingteng/p/11541223.html