C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でサイズが不明なソートされた配列を検索する


配列があり、昇順で並べ替えられているとすると、ターゲットをnumsで検索する関数を定義する必要があります。ターゲットが存在する場合はそのインデックスを返し、そうでない場合は-1を返します。

アレイのサイズは不明です。 ArrayReaderインターフェイスを使用してのみ配列にアクセスできます。 ArrayReader.get(k)のようなget関数があり、これはインデックスkにある配列の要素を返します。

したがって、入力がarray =[-1,0,3,5,9,12]、target =9の場合、9がnumsに存在し、そのインデックスが4であるため、出力は4になります。

これを解決するには、次の手順に従います-

  • 高:=1、低:=0

  • リーダーのget(high)

    • 低:=高

    • 高=高*2

  • 低い<=高い間、実行-

    • 中:=低+(高-低)/ 2

    • x:=リーダーのget(mid)

    • xがターゲットと同じ場合、-

      • 途中で戻る

    • x>ターゲットの場合、-

      • 高:=中-1

    • それ以外の場合

      • 低:=中+ 1

  • -1を返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class ArrayReader{
private:
   vector<int> v;
public:
   ArrayReader(vector<int> &v){
      this->v = v;
   }
   int get(int i){
      return v[i];
   }
};
class Solution {
public:
   int search(ArrayReader& reader, int target) {
      int high = 1;
      int low = 0;
      while (reader.get(high) < target) {
         low = high;
         high <<= 1;
      }
      while (low <= high) {
         int mid = low + (high - low) / 2;
         int x = reader.get(mid);
         if (x == target)
            return mid;
         if (x > target) {
            high = mid - 1;
         }
         else
            low = mid + 1;
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<int> v = {-1,0,3,5,9,12};
   ArrayReader reader(v);
   cout<<(ob.search(reader, 9));
}

入力

{-1,0,3,5,9,12}, 9

出力

4

  1. ソートされたリストをC++でバイナリ検索ツリーに変換する

    要素が昇順でソートされている単一リンクリストがあるとすると、それを高さバランスのとれたBSTに変換する必要があります。したがって、リストが[-10、-3、0、5、9]のような場合、可能なツリーは-のようになります。 これを解決するには、次の手順に従います- リストが空の場合は、nullを返します sortListToBST()と呼ばれる再帰メソッドを定義します。これにより、リストの開始ノードが取得されます x:=リストaからの中間ノードの前のノードのアドレス mid:=正確なミッドノード midの値から取得して、値を持つ新しいノードを作成します ne

  2. C ++のアレイディケイとは何ですか?

    アレイのタイプと次元の喪失は、アレイの減衰として知られています。これは、ポインタまたは値によって配列を関数に渡すときに発生します。最初のアドレスは、ポインタである配列に送信されます。そのため、配列のサイズは元のサイズではありません。 これは、C++言語での配列減衰の例です 例 #include<iostream> using namespace std; void DisplayValue(int *p) {    cout << "New size of array by passing the value : "; &nbs