给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
思路:
如果数组的中位数mid小于目标数字,则在数组的右侧right继续查找。
如果数组的中位数大于等于目标数字,则在数组的左侧left继续查找。
直到数组中左侧下标等于右侧下表。
mid=(left+right)/2;
复杂度:
1)时间复杂度:假设以最坏情况考虑,二分查找第一次在n/2中查找(n为元素个数);第二次在一半的一半中查找,即n/2/2=n/4;……第x次在n/2x范围内查找,即2x=n(x=log2n),所以时间复杂度为O(log2n).
2)空间复杂度:递归深度为N*每次递归的辅助空间大小,如果每次递归的辅助空间为常数,则空间复杂度为O(N)。
对于递归的二分查找,递归深度是log2n,每次递归的辅助空间为常数,所以空间复杂度为O(log2N)
int binarySearch(vector<int> &nums, int target) {
int left = 0;
int right = nums.size()-1;
int mid = (left + right) / 2;
while (left < right) {
if (nums[mid] < target) left = mid + 1;
if (nums[mid] >= target) right = mid;
mid = (left + right) / 2;
}
return nums[mid] == target ? mid : -1;
}
nums[mid] == target ? mid : -1;
若nums[mid] == target为真则执行mid;若条件不为真,执行-1