本文参考代码随想录
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
- 假设nums中的所有元素是不重复的,n在[1,10000]之间,nums每个元素在[-9999,9999]之间
写法1
定义target在一个左闭右闭区间[left, right]
- while(left<=right),要使用<=
- if(nums[middle] > target) right就要赋值为middle - 1
class Solution{
public:
int search(vector<int>& nums, int target){
int left = 0;
int right = nums.size() - 1;//左闭右闭区间
while (left <= right){//left == right时依然有效
int middle = left + ((right - left) / 2);//防止溢出
if(nums[middle] > target){
right= middle - 1;
}else if (nums[middle] < target) {
left = middle + 1;
}else {
return middle;
}
}
return -1;
}
};
时间复杂度O(logn)
空间复杂度O(1)
写法2
定义target在左闭右开区间[left, right)
- while(left < right), 此时不能<=因为当left == right时没有意义
- if(nums[middle] > target)right更新为middle
class Solution{
public:
int search(vector<int>& nums, int target){
int left = 0;
int right = nums.size();
while(left < right){
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle;
}else if (nums[middle] < target) {
left = middle + 1;
} else{
return middle;
}
return -1;
}
};
时间复杂度O(logn)
空间复杂度O(1)