1.整数二分查找
704. 二分查找 - 力扣(LeetCode) (leetcode-cn.com)
正常解法:
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0,r = nums.size() - 1;
while(l <= r){
int mid = (l + r ) >> 1; //正常除2为向下取整
if(nums[mid] > target) r = mid -1;
else if( nums[mid] < target) l = mid + 1;
else {
return mid;
}
}
return -1;
}
};
取左边界方法:
class Solution {
public:
int search(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int l = 0 , r = nums.size() - 1;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
if(nums[l] == target) return l;
return -1;
}
};
取右边界:
class Solution {
public:
int search(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int l = 0 , r = nums.size() - 1;
while(l < r){
int mid = l + r + 1 >> 1; // 向上取整,保证边界不出问题,不会出现死循环
if(nums[mid] <= target) l = mid;
else r = mid -1;
}
if(nums[l] == target) return l;
return -1;
}
};
练习:数的范围:789. 数的范围 - AcWing题库
浮点数二分查找:790. 数的三次方根 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
int main(){
double x,n;
scanf("%lf",&x);
double l = -10000 , r = 10000; // 注意题目要求范围值
while(r - l > 1e-8){ // 注意误差为1e-8
double mid = (l + r)/2;
if(mid*mid*mid >= x) r = mid; //由于是浮点数,为一个范围,故边界问题简单处理即可
else l = mid;
}
printf("%.6lf",l);
return 0;
}