#97 二分

模板

	boolean check(int x){
		//检查x是否满足某种性质
		return true;
	}
	
	//整数二分1
	//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用
	//(寻找满足某种性质的最大点时使用)
	int bseach_1(int l, int r) {		
		while(l<r) {
			int mid = l+r >> 1;
		    if (check(mid)) r = mid;
		    else l = mid + 1;		
		}
		return l;
	}
	
	//整数二分2
	//区间[l,r]被划分成[l,mid-1]和[mid,r]时使用
	//(寻找满足某种性质的最小点时使用)
	int bsearch_2(int l, int r) {
		while (l < r) {
			int mid = l + r + 1 >> 1;
		    if (check(mid)) l = mid;
		    else r = mid - 1;		
		}
		return l;
	}
	
	
	//浮点数二分
	boolean check(double x) {
		//检查x是否满足某种性质		
		return true;
	}
	double bsearch(double l, double r) {
		const double eps = 1e-6; // eps 表示精度,若题目要求保留n位小数,则取1e-(n+2)
		while(l - r < eps) {
			double mid = (l + r)/2;
			if(check(mid)) r = mid;
			else l = mid;
		}
		return l;
	}

算法思路

左边界l,右边界r

整数二分1:mid = (l + r)/2

整数二分2:mid = (l+ r + 1)/2 //当l=r-1时,若check(mid)=true,发生死循环,多加个1可避免死循环

浮点数二分:mid = (l + r)/2

例题

(1)

(2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值