数组-二分查找-简单

描述
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战

如果数组中的整数个数超过了2^32,你的算法是否会出错?

分析

对于已排序的数组进行二分查找,将该数组nums的两端分别设为left, right,求取其mid。

如果nums[mid] > target,则right = mid

如果nums[mid] < target,则left = mid

如果nums[mid] == target,则对mid--,直到nums[mid] != target,返回最后的结果,即为target第一次出现的下标。

题目链接

程序

class Solution {
public:
    /**
     * @param nums: The integer array.
     * @param target: Target to find.
     * @return: The first position of target. Position starts from 0.
     */
    int binarySearch(vector<int> &nums, int target) {
        // write your code here
        int right = nums.size() - 1;
        int left = 0;
        return binarySearch2(nums, target, left, right);
    }
    int binarySearch2(vector<int> &nums, int target, int left, int right){
        while(left<=right){
            int mid = (left+right)>>1;
            if(nums[mid] == target){
                while(mid>0 && nums[mid-1] == target && mid--)
                    NULL;
                return mid;
            }
            else if(nums[mid] < target){
                left = mid + 1;
            }
            else{
                right = mid - 1;
            }
        }
        return -1;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80508216