博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分模板
阅读量:6289 次
发布时间:2019-06-22

本文共 881 字,大约阅读时间需要 2 分钟。

二分分为二分查找和二分答案。

 

 

二分查找。实际上就是一个有序数列中有一个解,然后搜一遍求这个解。而直接for循环暴搜一遍的话时间复杂度是On),而用二分查找可以降低时间复杂度,为Ologn);而数组形象化出来的话就是00000100000000为无解,1为有解),二分就是要找中间的1,即为唯一解。所以开始lr设为一定是无解的部分,代码如下。

 

int search(int key) {	int l = 0, r = n + 1  //一定无解	while(l + 1 < r)	{   		int mid = (l + r) >> 1;   		if(a[mid] == key) return mid;//找到了   		if(a[mid] > key) r = mid;		   		else l = mid; 			}	return -1;}

 

 

 

注:如果求函数解析式的值,只用改while条件是 r-l小于题目最小精度再小两个精度

 

二分答案是二分查找的推广,即是有很多个解,然后寻找最优解。

一般求最大值就是就是1111100000000。此时r仍然是一定无解,而l则是一定有解的边界(即数组的最小下标),最后输出l

 最小值则返过来是00001111,此时l是无解,r是有解,最后输出r

 

下面是1111000情况的代码

 

 

int l = 1, r = n + 1;while(l + 1 < r){   int mid = (l + r) >> 1;   if(!check(mid)) r=mid; //表示mid不符合题目要求,无解   else l=mid; }//最终l为解

题目中的运用一般分三类,一是查找某个元素是否存在用二分优化复杂度(前提是有序,要先排序),二是计算函数取值三是枚举最优解。这三种用法的写法有区别,要注意区分。二分答案用的比较多,一般是在比较midkey的地方做了手脚,根据题目写个checkmid)函数即可。

 

 

 

 

 

转载于:https://www.cnblogs.com/sugewud/p/9819544.html

你可能感兴趣的文章
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
查看>>
rsync同步工具的配置与使用
查看>>
浅谈现公司的Spring Cloud微服务框架
查看>>
【OCP-12c】CUUG 071题库考试原题及答案解析(17)
查看>>
RAC RMAN 备份 RMAN-03009 ORA-19504 ORA-27040 RMAN-06012 channel c3 not allocated 错误分析
查看>>
[转]指针函数与函数指针的区别
查看>>
【转】Terracotta's Scalability Story
查看>>
Python 词频统计
查看>>
种类并查集,TOJ(1706)
查看>>
java PO、BO
查看>>
docker拉取镜像报错:net/http: TLS handshake timeout.
查看>>
sublime text笔记
查看>>
为CommonMark.Net增加Table解析
查看>>
multi_index_container 多索引容器
查看>>
【学习Android NDK开发】Android.mk文件
查看>>
iOS-关于iOS应用支持IP6
查看>>
企业USB权限控制心得^
查看>>
Linux shell编程学习笔记-----第十七章
查看>>
Spring-MVC
查看>>
Vue+Element+computed实现购物车
查看>>