题意:
- 给定数组和目标值,利用二分查找在数组中寻找目标值。
方法一:
解题思路:
- 首先用
left
和right
表示查找范围,用mid=(left+right)/2
进行二分查找,如果nums[mid]==target
,则直接返回mid
;如果nums[mid]>target
,则将right
更新为mid
;如果nums[mid]<target
,则将left
更新为mid
。 - 边界条件:1.如代码16行,能有效判断数组只有一个数的情况,以及剪枝。2.当数组中仅剩两个数时,直接判断这两个数中是否存在等于
target
的。
代码如下:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param target int整型
* @return int整型
*/
int search(vector<int>& nums, int target) {
// write code here
int left=0,right=nums.size()-1;
while(left<=right){
//目标值不存在的情况
if(nums[right]<target||nums[left]>target)
return -1;
//当判断的数只有两个时的情况讨论
if(left==right-1){
if(nums[left]==target)
return left;
if(nums[right]==target)
return right;
return -1;
}
//二分查找
int mid=(left+right)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
right=mid;
else
left=mid;
}
return -1;
}
};
图解如下:
复杂度分析:
时间复杂度:O(logn),二分法查找。
空间复杂度:O(1),仅常数个临时变量。