二分法优化
1,基本的二分思想:
int BinarySearch(int a[],int size,int key) { int L = 0; //查找区间的左端点 int R = size - 1; //查找区间的右端点 while( L <= R) { //如果查找区间不为空就继续查找 int mid = L+(R-L)/2; //取查找区间正中元素的下标 if( key == a[mid] ) return mid; else if( key > a[mid]) L = mid + 1; //设置新的查找区间的左端点 else R = mid - 1; //设置新的查找区间的右端点 } return -1; }
其实:L+(R-L)/2=(R+L)/2
为了防止(L+R)溢出,才这样写(出于ACM的需要)
2,将L R的初始化边界扩展1
int internalFor(int a[], int l, int r, int key) {//二分法查找a[] l到r区间的某个值 int L = l - 1; int R = r + 1; int mid; while (R - L > 1) {//不能设置等于 mid = L + (R - L) / 2; if (a[mid] > key) { R = mid; } if (a[mid] < key) { L = mid; } if (a[mid] == key) { return mid; } } return -1; }
3,二分算法用于不等式范围查找:
int bs_nomorethan(int a[], int l, int r, int key) {//寻找小于等于key的元素的个数 int L = l - 1; int R = r + 1; int mid; while (R - L > 1) { mid = L + (R - L) / 2; if (a[mid] <= key) { L = mid; } if (a[mid] > key) { R = mid; } } return L; }
4,基于二分法思想的左右线性移动查找:
void ArrayTwoNumberAdd(int a[], int size,int sum) {//使用两边移动桶的方式,进行对数组的两个数之和进行判断 int L = 0; int R = size - 1; int num = 0; while (L <= R) { if (a[L] + a[R] > sum) { R--; } if (a[L] + a[R] < sum) { L++; } if (a[L] + a[R] == sum) { cout << a[L] << "+" << a[R] << "=" << sum << endl; L++; R--; num++; } } cout << "总共有个:" << num << "对" << endl; }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
我有接口文档, 你有酒吗?
接口文档生成流程 介绍 目前我们QA在测试过程中, 存在着接口文档不全或有出入(包括更新)的情况。 这时候我们一般会阅读开发编写的代码或者直截了当去问开发。 这2种方法的弊端都很明显, 即增加了沟通和时间成本。 自己看代码且不论QA对于开发语言的熟悉程度, 有的代码QA并不可见。独自研究费时费力, 去找开发询问的时候,得问到对应的人, 他们还需要花费时间精力去搜寻。 ==现在, 这些问题都将迎刃而解==。 原理介绍 通过swagger插件(如jar包)解析编写了接口注解的java代码, 而后通过生成的swagger.json文件解析出接口信息并导入接口文档管理工具(yapi)。 第一步: 编写注解 swagger是一个较为流行的接口文档管理工具, 但是这里我们不打算将他作为我们的大方向。其实接口文档的核心基本都已固定, 如path(route), 参数, 响应, 请求方式等。swagger在这点做得相当不错, 使用json-schema约束json字段的属性(required, example, type等)。 简而言之, 第一步就是通过注解对java中各个字段的参数做了约束, 通过插...
- 下一篇
关于Java健壮性的一些思考与实践!
程序健壮性非常重要,要怎么玩怎么写才能让程序更加鲁棒呢?我又这么几点小建议。 一、进行统一的业务处理响应 根据蚂蚁金服开放平台的标准返回,一个 response 至少应当有4个返回值。 1、isSuccess:调用是否成功 2、data:返回的响应数据 3、errorCode:错误码 4、errorMsg:错误信息 这就要求我们的接口要有标准的统一的 response ,那怎么实现呢? 1、Spring 切面, JDK 动态代理,Cglib 动态代理等用代理类实现 2、匿名子类,使用一个公共的 Executor 来负责处理所有的请求。 上面两种模式都可以实现标准的 response 的封装,那么具体要封装哪些东西呢?其实最主要的就是统一的 try catch,防止出现任何的 500 错误给到调用方。 ------ 为什么要在最外层去完成呢?------ 因为 500 错误对于调用方来说是致命而且是毫无价值的,无论调用方是前端还是其他的业务系统 ------ 设定统一的错误码 ------ 例如: 参数错误:PARAMETER_ERROR 数据库错误: DATABASE_ERROR 外部...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7设置SWAP分区,小内存服务器的救世主