704 二分查找
题目就是给定一个升序不重复的数组, 找出给定的tag所在的索引值, 使用二分查找
- 二分查找算法的实现过程比较简单:
- 设定左右指针
- 找出中间位置,并判断该位置值是否等于 target
- nums[mid] == target 则返回该位置下标
- nums[mid] > target 则右侧指针移到中间
- nums[mid] < target 则左侧指针移到中间
- 一般有两种写法, 这个和右指针的设置相关
- 区间为:[left, right]时, 即left== right时其“搜索区间” 仍然是存在的, 所以循环条件应该是
left <= right, 而对应条件的改变应该是:right = mid - 1,left = mid + 1 - 区间为: [left, right)时, 代码如下
- 区间为:[left, right]时, 即left== right时其“搜索区间” 仍然是存在的, 所以循环条件应该是
- 另一个细节时
mid的计算, 为了防止所需要查找的数据过大, 即left + right溢出, 一般使用left + ((right - left) / 2)来代替(left + right) / 2,- 同样为了进一步优化计算性能, 可以将“除2”的操作转换为右移一位(计算机计算移位运算比除法运算快许多), 即:
left + ((right - left) >> 1)
- 同样为了进一步优化计算性能, 可以将“除2”的操作转换为右移一位(计算机计算移位运算比除法运算快许多), 即:
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;
}
};