首页 > 其他 > 详细

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

时间:2015-11-23 06:14:04      阅读:296      评论:0      收藏:0      [点我收藏+]

给定一个排序的整数数组(升序)和一个要查找的整数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;
    }

}

 

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

原文:http://www.cnblogs.com/wangnanabuaa/p/4987304.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!