제목 설명
횟수를 정렬 배열에 나타나는 숫자를 계산합니다.
해결 방법 :
사용 이분법은 몇 가지를 알고 K, 마지막 K를 찾기 위해 다시, 수 k를 앞으로 먼저 한 다음 찾기를 K를 찾아
숫자 N은 K 그러나, 일단 추적 헤드 통과를 구별하지이 방법은, 복잡도는 O (N)의
이분법을 재사용 할 수있는, 한 번 K의 왼쪽 절반 위치 K 이분법은 더 이상 오른쪽 부분과 유사, 처음에 나타나지 찾는 데 사용됩니다 발견했다.
1 급 Solution01 { 2 공개 : 3 INT GetNumberOfK (벡터 < INT > 데이터 의 INT K) { 도 4 의 경우 (data.size () == 0 ) 복귀 0 ; 5 INT를 L = 0 , R = data.size () - 1 , M; 6 동안 (L <= R) 7 { 8 M = (R - 1) / 2 + L; 도 9 의 경우 (데이터 [M] == K) 체류 ; 10 다른 경우(데이터 [M]> K) R = M - 1 ; 11 다른에서 L = M + 1 ; (12) } (13) 의 경우 (L> R) 복귀 0 ; 14 L = R = M; 15 INT의 입술 = 0 ; 16 일 동안 (L> = 0 && 데이터 [L] == K) { 17 입술 ++; - L; 18 } 19 반면 (R <data.size () && 데이터 [R] == K) { 20 입술 ++; ++ R; 21 } 22 반환 고해상도를 - 1 ; 23 } 24 }; 25 (26) 클래스 Solution02 { 27 공용 : 28 INT GetNumberOfK (벡터 < INT > 데이터 의 INT K) { 29 일 경우 (data.size () == 0 ) 복귀 0 ; 30 의 INT pM의 발견 = (데이터 0 , data.size () - 1 , K); 31 의 경우 (데이터 [μM의] = K!) 복귀 0 ; 32 INT PL = PM, PR = pM의; 33 동안 (! PL = - 1 개 && 데이터 [PL] == K) = PL 찾기 (데이터 0 , PL - 1 , K); 34 동안 (! PR = - 1 개 && 데이터 [PR] == K) = PR 발견 (데이터, PR + 1 , data.size () - 1 , K); 35 창 (PR == - 1 ? data.size () : PR) - PL - 1 ; 36 } 37 INT의 발견 ( CONST 벡터 < INT > 데이터 INT의 L, INT의 R, CONST의 INT의 K) 38 { 39 INT M = - 1 ; 40 동안 (L> = 0 && R <data.size () && L <= R) 41 { 42 M = (R - 1) / 2 + L; 43 의 경우 (데이터 [M] == K) 분해 ; (44) 그 밖의 경우 (데이터 [M]> K) R = M - 1 ; 45 사람의 L = M + 1 ; 46 } 47 리턴 M; 48 } 49 };