首先用二分查找法的前提是该遍历的数组为一个有序的数组。
其次二分查找的时间复杂度为log2(n),大大节省了查找时间。
目前的学习有两种应用:1.找到区间相同的数。2.如找数组中第一个大于5的数。
二分查找的实现:
1.定义left right数组指针,分别为-1,和sizeof(数组),不指向数组元素的下标,这样会避免一些不必要的麻烦(如一个数组中全为满足left的条件,这样刚开始right越界了导致错误),循环的条件:left+1!=right之后:分为两种
(找一个数:)之后要判断它的条件如果等于target则return下标,或者nums[val]<target,则移动left指针否则移动left在判断是否和target相等,直到循环结束没有找到return -1。(找数组中大于某个数的数:)确定范围,根据范围来确定left指针移动的条件。
具体代码实现:第一个找数
class Solution {
public:
int search(vector<int>& nums, int target) {
int right=nums.size();
int left=-1;
while(left+1!=right){
if(nums[(left+right)/2]==target){
return (left+right)/2;
}else if(nums[(left+right)/2]>target){
right=(left+right)/2;
}else{
left=(left+right)/2;
}
}
return -1;
}
};
第二个找满足条件的数:
int search(int nums[],int lenth) {//找数组中第一个大于9的数
int left = -1;
int right = lenth ;
while (left+1<right) {
int val=(left + right)/2;
if (nums[val]<=9) {
left = val;
}
else {
right = val;
}
}
return right;
}