제안 승 - 56 숫자의 정렬 된 배열을 찾기

제목 설명

횟수를 정렬 배열에 나타나는 숫자를 계산합니다.
 
해결 방법 :
  사용 이분법은 몇 가지를 알고 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 };

 

추천

출처www.cnblogs.com/zzw1024/p/11706308.html