要求:给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
样例:在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
思路:使用递归,每次都找到中间那个数进行判断,直到区间第一个数的下标等于最后一个数的下标。判断的时候,对中间的数进行判断,分为3种情况,一种是刚好等于我们要找的数,这时候不能够直接返回下标,因为我们不确定这个数的前面是否存在着同样的数,所以,要对这个数前面的数进行查找,找到就返回前面的,没找到就返回中间数的下标
,当中间数小于目标数时,查找后一半,当中间数大于目标数的时候,查找前面一半。递归直到区间只有一个数。
代码如下:
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 return search(nums,target,0,nums.length); } public int search(int []nums,int target,int first,int last){ if(first==last){ if(nums[first]==target) return first; else return -1; }else{ int avg=(first+last)/2; if(nums[avg]==target){ if(search(nums,target,first,avg)==-1)//查找前一半有没有相同的数 return nums[avg]; else return search(nums,target,first,avg); } else if(nums[avg]>target) return search(nums,target,first,avg); else if(nums[avg]<target){ return search(nums,target,avg+1,last); } return -1; } } }