输入n个数字,反复查找某个数字是否存在。
第一行n和T,代表n个数字,T次查询 。 接下来一行n个数字 。 接下来T行表示每次查询的数字 。
对于每次查询,查询成功输出"YES",失败输出"NO",以换行为间隔。
数据范围:n<=100000,T<=100000
这是一道二分算法题,时间复杂度为 O ( l o g 2 n ) O(log2n) O(log2n)。
将所有给出的数据排列, 建立两个指针 l l l 和 r r r,初始时分别居于排列好的数组两侧。 l = 0 l=0 l=0, r = n r=n r=n。 找到数据的中点 m m m, 并判断我们要查找的数与中点 m m m 的关系。 众所周知 当我们要查找的数小于 m m m 时,说明数据在 l l l 和 m m m 的范围内,那么我们就可以把右指针 r r r 变为 m + 1 m+1 m+1。 当我们要查找的数大于 m m m 时,说明数据在 m m m 和 r r r 的范围内,那么我们就可以把左指针 l l l 变为 m − 1 m-1 m−1。 执行完上述操作后,我们需要继续判断下一个中点,直到左指针 l l l 大于等于右指针 r r r。 如果找到了,就返回这个数已找到。 如果左指针 l l l 大于等于右指针 r r r 时还没有找到,说明在给出的数据中没有符合要求的数,我们就可以返回这个数查询失败。 最后判断输出。
