二分查找

终于下定决心写博客了(好久之前就有这个想法了,但是一直不知道要写啥,可能是因为自己水平太弱了吧,虽然说现在还是很弱,但还是决定开始写了),主要是记录一下的自己的学习成长经历,写的内容会比较基础。

 

一道牛客网收录的2017去哪儿的校招真题(连接:点击打开链接)

这道题总的来说是一道常规题,但是有两个地方如果没有注意到,还是会出错的。

题目要求:

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

测试样例:

[1,3,5,7,9],5,3
返回:1

直接看代码应该比较清晰

 

class BinarySearch {
public:
    int getPos(vector A, int n, int val) {
        // write code here
        if (n < 1) return -1;
 
        if (A[0] <= A[n-1]) {
            size_t low = 0;
            size_t high = n - 1;
 
            while (low <= high) {
                size_t mid = (low + high) / 2;
                if (val > A[mid]) {
                    low = mid + 1;
                } else if (val < A[mid]) {
                    high = mid - 1;
                } else {
                    while (mid >= 1 && A[mid] == A[mid - 1]) --mid;
                    return mid;
                }
            }
            return -1;
        } else {
            size_t low = 0;
            size_t high = n - 1;
 
            while (low <= high) {
                size_t mid = (low + high) / 2;
                if (val < A[mid]) {
                    low = mid + 1;
                } else if (val > A[mid]) {
                    high = mid - 1;
                } else {
                    while (mid >= 1 && A[mid] == A[mid - 1]) --mid;
                    return mid;
                }
            }
            return -1;
        }
    }
};

 

 

 

这里需要注意的地方有 :

1.题目并没有说明是递增还是递减序列,这就需要在写程序的时候考虑进去。 
2.可能存在重复元素,题目要求返回要查找元素在给定序列中第一次出现的位置,没有找到则返回-1
 
我当时在写这道题的时候这两个地方都考虑到了(当时觉得面试题肯定不会那么平常, 就只考察二分的代码)但是第一次提交的时候还是没有通过
 
while (mid >= 1 && A[mid] == A[mid - 1]) --mid;

第一次写的时候, 不知怎么的写成了mid > 1 就出错了, 还是因为检查的不够仔细吧!

 

你可能感兴趣的:(数据结构与算法)