タイトル:順序付きリストを考えるには、1つのみの対象があることを確認するために、その要素の25%以上の出現回数を返します。
入力:ARR = [ 1、2、2、6、6、6、6、7、10 ] 出力:6
分析:
方法の一つ:トラバース
時間計算量はO(N)であり、空間的な複雑さはO(1)であります
INT findSpecialInteger(ベクトル< INT >&ARR){ int型 LEN = arr.size()。 INTのステップ= LEN / 4 。 以下のために(INT iが= 0 ; I +ステップ<LEN; I ++ ) { もし(ARR [I] == ARR [I + ステップ]) 戻りARR [I]。 } リターン - 1 。 }
方法2:バイナリ検索
要求の対象、整数は、次に我々は結論付けることができ、図ARR = arr.length / 4 + 1アレイの少なくとも現れスパンの条件を満足する×:ARR、ARR ARRの配列要素[0]、ARR [スパン] [スパン* 2]、...となるxが含まれている必要があります。
連続スパンの数ので、スパンはの倍数でなければなりません。
我々はLOWER_BOUNDするには、いくつかの間隔のスパンとUPPER_BOUND見てみるので、出現回数を取得します。
INT findSpecialInteger(ベクトル< INT >&ARR){ int型 N = arr.size()。 INTのステップ= N / 4 + 1 。 以下のために(INT iが= 0 ; I <N; I + = ステップ) { ベクター < INT > ::イテレータit_l = LOWER_BOUND(arr.begin()、arr.end()、ARR [I])。 ベクター < INT > ::イテレータit_r = UPPER_BOUND(arr.begin()、arr.end()、ARR [I])。 もし(it_r - it_l> = ステップ) 戻りARR [I]。 } リターン - 1 。 }
一見時間複雑性はO(nlogn)です?
一見は、4個まで列挙要素が、時間複雑度は、O(LOGN)。