LintCode刷题---二分查找

描述:

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

样例 :

  输入: [1, 2, 3, 3, 4, 5, 10], 3

  输出: 2

  样例解释: 

  3 第一次出现在第2个

解题:

  难点分析:

      注意数组中存在着重复数据, 而利用二分查找找出来的数据不一定是第一个, 数据需要检验.

public int binarySearch(int[] nums, int target) {
        // write your code here
        if(nums == null || nums.length == 0){
            return -1;
        }
        int start = 0;
        int end = nums.length-1;
        while(start < end){
            int mid = (start + end) / 2;
            if(target == nums[mid]){
                end = mid;
            }
            else if(target <= nums[mid]){
                end = mid - 1;
            }
            else if(target >= nums[mid]){
                start = mid +1;
            }
        }
        if(target == nums[start]){
            return start;
        }
        return -1;
    }

  代码也没什么难度, 在LintCode中也是属于下游水平,(初学者)

  首先需要判断的是数组是否为空, 空就不需要二分查找了, 

  while中就是二分查找算法, 稍有修改

  值得注意的地方就是--当中间数nums[mid] 为查找数时, 这个数不一定就是第一个, 另 end=mid 再次二分查找,

  寻找是否还有前面的数也是查找数, 没有时start = end 循环就会退出, 而此时的 end = mid;

  最后一个if检验查找数是否在数组中, 是时 nums[start]一定就是查找数.

猜你喜欢

转载自www.cnblogs.com/S-Evildoer/p/10957492.html