二分查找(改)
来源:互联网 发布:公安网络安全保密协议 编辑:程序博客网 时间:2024/05/22 06:58
2016/3/25
二分查找,应该是面试里比较简单但是也会问道的问题。
这个代码,是我初看见二分查找的原理时写的,用的递归。好吧,有明显的错误,就是当寻找的值不在数组中时会越界。
int FindX(const vector<int>& a,int left,int right ,int k){int center = (left + right) / 2;if (k>a[center]){FindX(a, center+1, right, k);}else if (k<a[center]){FindX(a, left, center, k);}else if (k == a[center]){return a[center];}else{return -1;}}
举个例子,如果数组是(1,2,3,4),要查找5时,center就会一直往上加。
真正的二分查找。
int binarySearch(const vector<int> &a, const int k)//真正的二分查找{int low = 0, high = a.size() - 1;while (low<=high){int mid = (low + high) / 2;if (a[mid]>k){high = mid - 1;}else if (a[mid]<k){low = mid + 1;}else{return a[mid];}}return -1;}
可以看出来是把边界往中间移,来堵死要查找的数,当边界重合但是还没有找到数的时候,就跳出循环,返回-1。
在学习数据结构与算法的时候,都会觉得自己是个智障,同时钦佩这些创造算法的人。
2016/6/26
今天突然想起来了,自己改了一下之前的递归形式。发现当时自己好弱,只要加个边界检测就好了,但是当时都不会写。
递归的会爆栈的原因,主要是如果k比现有的数大,左边界会一直增加,或者相反,右边界一直减小。
int FindX(const vector<int>& a,int left,int right ,int k){if (right<0||left>(a.size()-1)){return-1;}int center = (left + right) / 2;if (k>a[center]){FindX(a, center+1, right, k);}else if (k<a[center]){FindX(a, left, center-1, k);}else if (k == a[center]){return a[center];}else{return -1;}}
也工作了一段时间,真的要重视基础。任何时候,花费多少努力夯实基础都是有意义的。
分享一句之前微博上看见的话,觉得讲得不只是画画,任何学习都适用。
“画画要学透视,画场景要学材质,画原动画要学运动规律,画分镜要学视听语言,画前期还得学做中期…很烦对不对?无数人都想跳过这些基本功,直接按感觉来,结果达到一定程度后就n年再无进步。所以我常和新人说,所有这些你觉得烦的东西就好比铠甲,你身体强壮,铠甲就让你如虎添翼;你身体羸弱,铠甲本身就把你压垮了。你们看到的大师们基本都是开着高达来战的。”
0 0
- 二分查找(改)
- 折半查找(二分查找)
- 二分查找(折半查找)
- 二分查找(折半查找)
- 折半查找(二分查找)
- 折半查找(二分查找)
- 二分查找(折半查找)
- 折半查找(二分查找)
- 查找(一)二分查找
- 二分查找(折半查找)
- 二分查找(折半查找)
- 折半查找(二分查找)
- 二分查找(折半查找)
- 折半查找(二分查找)
- 折半查找(二分查找)
- 折半查找(二分查找)
- 折半查找(二分查找)
- 折中查找(二分查找)
- IOS 正则表达式
- android 广播接收器之通知栏页面跳转
- 你真的了解iOS代理设计模式吗?
- 增值税等普通发票扫描识别系统
- 主从同步设置的重要参数log_slave_updates
- 二分查找(改)
- LoaderManager和AsyncTaskLoader<D>详解
- AdpterView和Adapter接口以及实现的子类
- Ubuntu 15.10 编译Android源码环境搭建
- FZU2102Solve equation
- C++实验 学生成绩
- Android Bitmap面面观
- MySQL复制常用拓扑结构详解
- gym 100935E (数学推导 水~)