タイトル説明
回数にソート配列に表示される数をカウントします。
ソリューション:
最後のkを見つけるために戻って、二分法前進1の数kを検索し、Kを見つける使用し、のいくつかを知るために、K
数nをkしかし、一旦、フォローヘッドトラバーサルを区別しなかったこの方法は、複雑さはO(N)の
二分法を再利用することができ、一度kの左半分がもはやその右側の部分と同様に、最初に表示される場所のk個の二分法を見つけるために使用されていない見つけました。
1 クラスSolution01 { 2 公共: 3 INT GetNumberOfK(ベクトル< 整数 >データ、int型K){ 4 もし(data.size()== 0)戻り 0 ; 5 int型の L = 0、R = data.size() - 1 、M。 6 一方、(L <= R) 7 { 8 M =(R - L)/ 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は RES = 0 。 16 一方(L> = 0 &&データ[L] == k)は{ 17の RES ++。- L; 18 } 19 ながら(R <data.size()&&データ[R] == k)は{ 20の RES ++。++ R; 21 } 22 返す RESを- 1 。 23 } 24 }。 25 26 クラスSolution02 { 27 公共: 28 INT GetNumberOfK(ベクトル< 整数 >データ、int型K){ 29 であれば(data.size()== 0)戻り 0 ; 30 int型 PM =検索(データ、0、data.size() - 1 、K)。 31 であれば(データ【PM] = K!)戻り 0 ; 32 INTピコリットル= PM、PR = ピコモル。 33 ながら(!ピコリットル= - 1個の &&データ[ピコリットル] == k)はピコリットル=検索(データ、0のPL - 1 、K)。 34 ながら(!PR = - 1 &&データ[PR] == k)は、PR =を見つける(データ、PR + 1、data.size() - 1 、k)を、 35 リターン(PR == - 1?data.size():PR) -ピコリットル- 1 。 36 } 37 INT見つける(CONSTベクター< 整数、>データをint型の L、INT R、CONST int型K) 38 { 39 int型 M = - 1 ; 40 一方(L> = 0 && R <data.size()&& L <= R) 41 { 42 M =(R - L)/ 2 + L。 43 であれば(データ[M] == k)を破ります。 44 他の 場合(データ[M]> k)はR = M - 1 。 45 他 L = M + 1 。 46 } 47 リターンM。 48 } 49 }。