二分查找:
普通的遍历查找时间复杂度为O(n);在n很大的时候,查找并不是一件 “ 轻松 ” 的事情,因此我们需要更加快速更加便捷的查找方式;
二分查找的时间复杂度为O(logn);
二分查找的前提:存储的数据是有序的,即递增或递减等
具体实现思路:
假如我们要查找递增数组a[100],中有没有数字goal,如果没有则输出-1,如果有输出他在数组中的位置;
第一步:找到中间值mid;
第二步:比较a[mid]与goal的大小,如果goal更大,那么说明goal存放在mid+1-----a.size()-1;这一段中;
第三步:再根据(mid+1,a.size()-1)这一段的中间值判断goal在哪一段,不断进行重复;
第四步:一直到相等,或者细分到一组中只有一个值(匹配失败返回-1);
以下为具体代码:
#include<iostream>
#include<string>
using namespace std;
#define dp 100
int a[dp];
int getnumber(int goal,int l,int r) {
int mid = l + (r - l) / 2; 此处需要使用一点小技巧
if (a[mid] == goal)return mid;
else if (a[mid] > goal) {
return getnumber(goal, l, mid);
}
else if (a[mid] < goal) {
return getnumber(goal, mid + 1, r);
}
if (l >= r)return -1;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int goal;
cin >> goal;
cout << getnumber(goal, 0, n - 1) << endl;
return 0;
}
leetcode对应有习题:704-二分查找
分享我的提交:
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0;
int r=nums.size()-1;
/*if(nums.size()==1){
return 0;
}*/
while(l<=r){
int center=l+(r-l)/2;
if(nums[center]<target){
l=center+1;
}else if(nums[center]>target){
r=center-1;
}else return center;
}
return -1;
}
};