二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,可以在数据规模的对数时间复杂度内完成查找。
二分查找可以应用于数组,是因为数组具有有随机访问的特点,并且数组是有序的。
二分查找体现的数学思想是「减而治之」,可以通过当前看到的中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。
二分查找问题也是面试中经常考到的问题,虽然它的思想很简单,但写好二分查找算法并不是一件容易的事情。
1. 搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int len = nums.size();
if(target>nums[len-1]){
return len;
}
//从小到大,找到第一个大于等于目标值的元素
int left = 0;
int right = len-1;
int mid;
while(left<right){
mid = (left+right)/2;
if(nums[mid]>=target){
right = mid;
}else{
left = mid+1;
}
}
return left;
}
};
2. x的平方根
class Solution {
public:
int mySqrt(int x) {
if(x==0){
return 0;
}
int mid = x/2;
for(int i=1;i<=mid;i++){
if(x/i==i){
return i;
}else if(x/i>i && x/(i+1)<(i+1)){
return i;
}
}
return 1;
}
};
这里没用到二分法。。。