二分查找(first-position-of-target)

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

样例

在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2

挑战

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

解题思路:题目中明确要求了O(logn)的时间,所以其实这个算法要求很明确,就是不断递归利用中位数进行二分查找;同时我们还需要注意的是如果数组中的整数个数超过了2^32,数组的下标就会越界,因为数组的下标是int类型;

虽说二分法比较简单,大家应该都会,不过这道题一定要注意找的是第一个下标,所以在最后一定要确认target== nums[i]&&target!=nums[i-1]才是真正要找的下标i;

class Solution {
    /**
     * @param nums: The integer array.
     * @param target: Target to find.
     * @return: The first position of target. Position starts from 0.
     */
    public int binarySearch(int[] nums, int target) {
        //write your code here
        if(nums.length==1&&target==nums[0])   return 0;
        int len = nums.length;
        int index = binaryFind(nums,target,0,len);
        return index;
    }
    public  int binaryFind(int[] nums,int target,int left,int right){
        int median = (left+right)/2;
        if(nums[left]==target)  return left;
        if(left >= right )  return -1;
        if(target == nums[median]&&target != nums[median-1])  return median;
        if(target > nums[median])  return binaryFind(nums,target,median+1,right);
        if(target <= nums[median])  return binaryFind(nums,target,left,median);
        return -1;
    }

}
原文地址:https://www.cnblogs.com/wangnanabuaa/p/4987304.html