LintCode 二分查找

来源:互联网 发布:上海甲子网络怎么样 编辑:程序博客网 时间:2024/04/27 23:43

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1

您在真实的面试中是否遇到过这个题? Yes
样例
给出数组 [1, 2, 2, 4, 5, 5].

对于 target = 2, 返回 1 或者 2.
对于 target = 5, 返回 4 或者 5.
对于 target = 6, 返回 -1.

class Solution {public:    /**     * @param A an integer array sorted in ascending order     * @param target an integer     * @return an integer     */    int findPosition(vector<int>& A, int target) {        // Write your code here        int left = 0, right = A.size()-1;        if (right < 0) {            return -1;        }        int mid = (left + right)/2;        while(left < right) {            if(A[mid]<target){                left = mid +1;            }            if (A[mid]>=target) {                right = mid;            }            mid = (left + right)/2;        }        return A[mid] == target ? mid:-1;    }};

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。

您在真实的面试中是否遇到过这个题? Yes
样例
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。

class Solution {public:    /**     * @param nums: The integer array.     * @param target: Target number to find.     * @return: The first position of target. Position starts from 0.      */    int binarySearch(vector<int> &array, int target) {        // write your code here        int left =0, right = array.size()-1;        int mid = (left + right)/2;        if(right <0) {            return -1;        }        while(left<right) {            if (array[mid]<target) {                left = mid +1;            }            if (array[mid] >=target) {                right =mid;            }            mid =(left +right)/2;        }       //到此处。只是找到target。判断array[mid]前面的数是否为target        if (array[mid] ==target){            for(int i=mid-1;i>=0;i--) {                if(array[i] ==target) {                    mid =i;                }            }            return mid;        }        else  {            return -1;        }    }};