【100题】第四十八题 移位数组的二分查找
来源:互联网 发布:淘宝中的电子商务 编辑:程序博客网 时间:2024/05/16 14:47
一,题目
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
二,分析
1)在此序列不断二分的过程中,由于原序列是一个递减序列经过旋转得到的,将它从任何位置分开,都会得到两个序列,
其中一个是递减序列
另一个可以通过一个递减序列通过旋转得到。
2)这样在不断地二分查找时,我们处理的序列子片段要么就是一个旋转后递减序列,要么就是一个纯递减序列,
3)无论是前者还是后者,在继续分成两个片段时,至少有一个纯递减序列(可能两个都是,如果之前的序列片段就是纯递减序列的话)。
4)这样我们可以保证能找到一个片段是纯递减序列(if(data[i]>=data[j]))
5)然后判断我们要找的数是否在这个片段中(这是很直观的,if(data[i]<=num&&num<=data[j])),如果在则继续在此片段中查找,否则说明在另一个序列中,则递归在其中查找
三,源码
#include<iostream>using namespace std;int bisearch(int a[],int left,int right,int num){ if(a==NULL||right<0) return -1; if(left==right)//还剩下一个值的时候 { if(a[left]==num) return left; else return -1; } //int mid=(left+right)/2; int mid=left+(right-left)/2; if(a[mid]==num) return mid; if(a[mid]<=a[left])//左侧纯递减 { if(num>a[mid]&&num<=a[left]) //左侧 return bisearch(a,left,mid-1,num); else return bisearch(a,mid+1,right,num); } else //右侧纯递减 { if(num>=a[right]&&num<a[mid]) //右侧 return bisearch(a,mid+1,right,num); else return bisearch(a,left,mid-1,num); }}int main(){ int a[100]={4,3,2,1,6,5}; cout<<bisearch(a,0,5,6)<<endl; return 0;}
- 【100题】第四十八题 移位数组的二分查找
- 在左移的递减数组中查找某数 【微软面试100题 第四十八题】
- 第四十八题(左移递减数组中查找某一个数)
- 第四章 二分查找(数组)
- Search in Rotated Sorted Array 二分查找循环移位的有序数组
- 旋转数组的二分查找
- 旋转数组的二分查找
- 旋转数组的二分查找
- 数组的二分查找法
- 旋转数组的二分查找
- 有序数组的二分查找
- 无序数组的二分查找
- 旋转数组的二分查找
- 021.数组的二分查找
- 有序数组的二分查找
- 有序数组的二分查找
- 旋转数组的二分查找
- 数组的简单二分查找
- 解决oracle11g的ORA-12505问题
- ViewPagerIndicator
- 数字统计
- ViewPager实现页面切换
- ViewPager多页面滑动切换以及动画效果(转)
- 【100题】第四十八题 移位数组的二分查找
- python相关软件下载地址
- 条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- listview异步加载图片(深度优化)(转载)
- acrobat页面显示问题
- SQL Server总结之——索引
- 双系统下删除Linux的方法
- C#有什么用
- 图形学研究实力