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