描述
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战
如果数组中的整数个数超过了2^32,你的算法是否会出错?
分析
对于已排序的数组进行二分查找,将该数组nums的两端分别设为left, right,求取其mid。
如果nums[mid] > target,则right = mid
如果nums[mid] < target,则left = mid
如果nums[mid] == target,则对mid--,直到nums[mid] != target,返回最后的结果,即为target第一次出现的下标。
程序
class Solution { public: /** * @param nums: The integer array. * @param target: Target to find. * @return: The first position of target. Position starts from 0. */ int binarySearch(vector<int> &nums, int target) { // write your code here int right = nums.size() - 1; int left = 0; return binarySearch2(nums, target, left, right); } int binarySearch2(vector<int> &nums, int target, int left, int right){ while(left<=right){ int mid = (left+right)>>1; if(nums[mid] == target){ while(mid>0 && nums[mid-1] == target && mid--) NULL; return mid; } else if(nums[mid] < target){ left = mid + 1; } else{ right = mid - 1; } } return -1; } };