二分查找

来源:互联网 发布:阿里巴巴淘宝城地址 编辑:程序博客网 时间:2024/06/06 04:00

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


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

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

题目要求:

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

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

测试样例:
[1,3,5,7,9],5,3
返回:1
直接看代码应该比较清晰

class BinarySearch {public:    int getPos(vector<int> 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 就出错了敲打, 还是因为检查的不够仔细吧!
第一次写播客, 写完之后感觉好开心啊大笑!!!

原创粉丝点击