题目:给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
- 你可以假设 nums 中的所有元素是不重复的。
- n 将在 [1, 10000]之间。
- nums 的每个元素都将在 [-9999, 9999]之间。
方法:二分法
使用二分法需要需要确定好区间
如果定义right=nums.size()-1则为闭区间
if(nums[middle]>targht) 则right=middle-1(因为右边是闭区间,当前middle的下标已经被检查,所以不用再比较当前middle) 另一边同理。
如果定义了right=nums.size()则为开区间
if(nums[middle]>targht)则right=middle(因为右边是开区间,right设置为middle即可,因为不会比较右边取不到的下标)另一边因为是闭区间,所以left=middle+1
使用条件:1:有序数组 2:数组中的target值无重复
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; //闭区间的解法
while(left <= right){
int middle = (left + right) >> 1;
if(nums[middle] > target){
right = middle - 1; //两种方法在这里有所不同
}
else if(nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};