元のタイトル:「コンピュータアルゴリズムの設計と解析」、王暁東
[0:N-1]がセットxが配列されていないとき、xの最大の要素の位置を返すように、良好な配列を有し、バイナリサーチアルゴリズムを書き換えるアレイの行であることは私未満と位置の最小のJ Xの要素よりも大きいです。配列の要素を探し、iとjと同じ、両方の配列の位置x。
入力フォーマット:
2行を入力します。
最初の行は、n及びxの値であり、2行目は、それぞれ整数との間のスペースで区切られたn個の異なる整数、非降順です。
出力フォーマット:
添字jは最小X最大出力要素iはxの最小の要素よりも大きい最大屈折率よりも小さいです。配列の要素を検索する場合、i、jは同じ。ヒント:Xは、出力がフル値未満の場合:-1 0、xはすべての値よりも大きい場合、出力:N-1の値は、n個
サンプル入力:
ここでは、入力のセットを与えられています。例えば:
6 5
2 4 6 8 10 12
出力例:
出力に対応し、ここで考えます。例えば:
1 2
——————————————————————————————————分割线——————————————————————————————————————————————
思路:对于能够找到的元素,只需要把这个下标再输出一遍即可。
对于找不到的元素,我们从优化过的二分搜索算法着手。众所周知,二分搜索算法的左指针和右指针会渐渐靠近,如果要输出这个数离得最近的两个下标,不妨分析left和right的接近情况。【这里我用的是left>right的递归条件,这样子做除了简化代码,还有特殊用处】
左右のパラメータに渡された値の周りの各再帰括弧。
0を取得します(0,3) - >(0,0) - >(0、-1)
4を探している:(2,3) - >(3,3) - >(3,2)
6を探す:(2,3) - >(3,3) - >(4,3)
[注意:ミッド=(L + R)/ 2は、中間+1または-1度に丸められます]
それであれば、左右のフロントリターン-1の2つの値の順序を逆にするように、結果は正しい出力で見ることができます。ここで私は、グローバル変数を保存することを選択しました。
そして、判断が異なる出力を選択するために、-1を返す主な機能ではありません。
時間計算量:O(LOGN)[バイナリ検索、解釈されるべきではない]の空間複雑度はO(n)
収穫は:おそらく考えを知っていますが、棚ぼたを持っているかもしれませんが、見たときに脳内アンタイドトピック、シミュレーションを実行することはできません。
最後に、コードを添付
1つの#include <iostreamの> 2 使用して 名前空間STDを、 3 INT leftnum = 0 。 4 INT rightnum = 0 。 5 INT binarysearch(INT NUM []、int型左、INT右、INT chazhao) 6 { 7 // findnum ++。 8 int型ミッド。 9 もし(左> 右) 10 { 11 // COUT << "zhaobudao"。 12 leftnum = 左。 13 rightnum = 右。 14 リターン - 1 。 15 } 16 他の 17 { 18 半ば=(左+右)/ 2 。 19 であれば(NUM [中間] == chazhao) 20 { 21 リターンミッド。 22 } 23 そう であれば(NUM [中間]!= chazhao) 24 { 25 であれば(chazhao> NUM [中間]) 26 { 27 リターン binarysearch(NUM、ミッド+1 、右、chazhao)。 28 } 29 さもなければ 戻り(左NUM、ミッドbinarysearch 1 、chazhao)。 30 } 31 } 32 } 33 34 35 のint main()の 36 { 37 のint NUM [ 1000年]。 38 int型I、chazhao、N。 39 CIN >> N。 40 cinを>> chazhao。 41 のために(i = 0 ; iがn <I ++は) 42 { 43 CIN >>NUM [i]は、 44 } 45 46 int型の日付= binarysearch(NUM、0、N- 1 、chazhao)。 47 48 であれば(日付== - 1 ){ 49 COUT << rightnum << " " << leftnum。 50 51 } 52 他の 53 { 54 COUT <<日付<< " " << 日付。 55 } 56 57 }