旋转数组的二分查找
来源:互联网 发布:单片机电子秤电路图 编辑:程序博客网 时间:2024/05/01 08:59
1.问题描述
已知有序数组a[N],从中间某个位置k(k未知,k=-1表示整个数组有序)分开,然后将前后两部分互换,得到新的数组,在该新数组的查找元素x。如:a[]={1, 2, 5, 7, 9, 10, 15},从k=4分开,得到新数组a[]={9, 10, 15, 1, 2, 5, 7}。
<一次二分查找>:二分查找算法有两个关键点:1)数组有序;2)根据当前区间的中间元素与x的大小关系,确定下次二分查找在前半段区间还是后半段区间进行。
仔细分析该问题,可以发现,每次根据low和high求出mid后,mid左边([low, mid])和右边([mid, high])至少一个是有序的。
a[mid]分别与a[low]和a[high]比较,确定哪一段是有序的。
如果左边是有序的,若x<a[mid]且x>a[low],则high = mid-1;其他情况,low = mid+1;
如果右边是有序的,若x>a[mid]且x<a[high],则low = mid+1;其他情况,high = mid-1;
代码:
public class FindXInRotateArray {public int binarySearchInRotateArray(int[] a, int x) {int low = 0, high = a.length-1, mid;while(low <= high) {mid = low + ((high - low) >> 1);if(a[mid] == x)return mid;if(a[mid] >= a[low]) {//左边有序if(x < a[mid] && x >= a[low])high = mid - 1;elselow = mid + 1;} else {//右边有序if(x > a[mid] && x <= a[high])low = mid + 1;elsehigh = mid - 1;}}return -1;}}
阅读全文
0 0
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 查找旋转数组的最小值-- 二分查找
- 旋转有序数组的二分查找
- 旋转有序数组的二分查找
- 旋转有序数组的二分查找
- 旋转数组(二分查找)
- 二分查找应用-旋转数组
- 循环有序数组/旋转数组的二分查找
- 旋转数组 二分查找 查找一个目标值
- 解决旋转数组二分查找的万能程序
- 二分查找——旋转数组的最小数字
- 【剑指offer】旋转数组的最小数字&&二分查找
- C++拷贝构造函数详解
- 比特币市场和传统市场的简单比较
- Fabric 智能合约具体代码模板分析
- 联系人
- 统计
- 旋转数组的二分查找
- uva 1635 Irrelevant Elements [组合数, 唯一分解定理]
- 计算字符串中单词个数
- 搜狐2016招聘笔试题扎金花(未完待续)
- Git的相关知识
- windows 无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,windows只能安装在GPT磁盘上
- UVA A Spy in the Metro
- 概率(2)
- I/O 多路复用之select、poll、epoll详解