假设我们有一个数组,并且该数组按升序排序,我们必须定义一个函数以nums搜索目标。如果存在目标,则返回其索引,否则返回-1。
数组大小未知。我们只能使用ArrayReader接口访问该数组。有一个类似ArrayReader.get(k)的get函数,它将返回索引k处的数组元素。
因此,如果输入类似于array = [-1,0,3,5,9,12],target = 9,则输出将为4,因为存在9个数字,其索引为4
为了解决这个问题,我们将遵循以下步骤-
高:= 1,低:= 0
当阅读器的get(high)<目标时,执行-
低:=高
高=高* 2
当低<=高时,执行-
低:=中+ 1
高:=中-1
返回中
中:=低+(高-低)/ 2
x:=阅读器的get(mid)
如果x与目标相同,则-
如果x>目标,则-
除此以外
返回-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