关于二分法的边界感悟-java实现
来源:互联网 发布:淘宝代付 编辑:程序博客网 时间:2024/06/08 15:23
1.对于程序边界,你一定要维护住自己的标准,不能变。
2.注意循环不变量
package ShiyiQi;/** * Created by xurui on 2017/11/7. */class binarySearch{ public int binarySearch(int arr[], int n, int target){ //[]为数学上的双闭区间的意思 int l = 0 , r = n-1;//在[l...r]的范围内寻找target while( l <= r ) {//当l == r的时候,区间[l..r]仍然是有效的 int mid = (l+r)/2; if(target == mid) return mid; if(target > mid){ l = mid + 1;//此时区间为[mid+1...r] } else {//target < mid r = mid-1; //此时区间为[l...mid-1] } } return -1; }}public class AlgorithmFir { public static void main(String [] args){ int arr[] = {1,2,3,4,5,6,7,123,2342,15235214}; binarySearch tt = new binarySearch(); System.out.println("target:"+tt.binarySearch(arr,9,3)); }}
int l = 0 , r = n-1;
对于这一行代码,如果我想要变化
int l = 0 , r = n;
那么,相应的函数应该变为
class binarySearch{ public int binarySearch(int arr[], int n, int target){ //[)为数学上的左开右闭区间的意思 int l = 0 , r = n;//在【l...r)的范围内寻找target while( l < r ) {//当l == r的时候,区间【l..r)仍然是有效的 int mid = (l+r)/2; if(target == mid) return mid; if(target > mid){ l = mid + 1;//此时区间为【mid+1...r) } else {//target < mid r = mid; //此时区间为【l...mid) } } return -1; }}
TIPS:
这里有一个不容易被发现的bug,这是我在华东师范大学复试题目发现的,题目非常简单,大概就是计算排列组合C几几的问题,但是会溢出,解决的办法同这里的类似。代码行为
int mid = (l+r)/2;
大数相加会出现溢出,所以我们可以采用相减
int mid = l+(r-l)/2;
阅读全文
0 0
- 关于二分法的边界感悟-java实现
- 二分法插入排序的java简单实现
- 关于边界的问题
- 二分法Java实现
- JAVA 二分法查找实现
- JAVA 二分法查找实现
- java实现二分法查找
- java实现二分法查找
- Java实现二分法查找
- Java 实现二分法查找
- java 二分法查找实现
- Java语言实现二分法
- Java实现二分法查找
- 二分法查找JAVA实现
- 二分法查找 JAVA实现
- Java二分法查找实现
- java实现二分法
- 关于java 参数 值传递的感悟
- 在R中来连接mysql
- 张家口模型制作java拼图
- SFP-10G-SR价格及兼容性介绍
- ios 对于修改navigationItem的颜色和系统自带的navigationItem的rightBarButtonItem的颜色的问题
- 程序下载不运行,单步调试或复位运行正常
- 关于二分法的边界感悟-java实现
- 对比欧氏距离与余弦相似度
- mdk软件仿真需要注意的特别设置-灰天无力
- TCP 协议简介
- solr之dynamicField动态字段的使用
- gsoap SO_REUSEADDR
- Caffe学习笔记1--前言
- 6.2(2)
- 微信公众号开发之花生壳网站80端口映射失败