二分查找算法,也就是折半查找。
适用条件
时间复杂度 O(logn)
线性、 有序数组
算法思路
给定一个数组[ 0, 3, 6, 9 ]
看数字10是否在数组中
-
方案一 顺序查找
直接for循环遍历,时间复杂度O(n)
在此例中,需要比较4次
-
方案二 二分查找
首先得到查找区间的下标,给left right赋初值
while循环 若left<=right则继续比较
循环中 取中值 mid = (left+right)/2
如果mid位置的数字大于目标值,则说明目标值可能在左边 查找区间最大值(right)变小
如果mid位置的数字小于目标值,则说明目标值可能在右边 查找区间最大值(left)变大
在此例中,需要比较2次
算法代码
class Solution {
public:
int search(vector<int>& nums, int target) {
// 顺序查找
// for(int i=0;i<nums.size();i++){
// if(nums[i]==target)
// return i;
// }
// return -1;
// 二分查找
int left = 0, right = nums.size()-1;
int mid;
// 小于等于 注意!!
while(left <= right){
mid = (left+right)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<target)
left = mid+1;
else if(nums[mid]>target)
right = mid-1;
}
return -1;
}
};
记录于 2023年2月8日
刷算法题有感