LintCode刷题---二分查找

Posted s-evildoer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]一定就是查找数.

以上是关于LintCode刷题---二分查找的主要内容,如果未能解决你的问题,请参考以下文章

刷题--二分法

LintCode刷题笔记(九章ladder PartOne)--BugFree

LintCode 14. 二分查找

LintCode刷题——不同的二叉查找树III

LintCode 14---二分查找

lintcode457. 经典二分查找问题