排序旋转数组查找(Search in a sorted, rotated list)
来源:互联网 发布:用u盘重装mac系统 编辑:程序博客网 时间:2024/05/23 14:34
假设存在一个按升序排列的数组A,让A绕其中的一个元素旋转180度得到新的数组A1,如何在对数时间复杂度内完成对A1的查找呢?
对于A1这样的数组,我们仍可使用二分查找来找寻其中的元素,只是,在二分查找之前,需要找到其分界点,这样分界点的两边分别为增序数组,从而可以使用二分查找。因此上述问题的主要操作就是在找寻这个分界点。
例如a[6] = {4,5,6,1,2,3}这样的数组,我们需要找到元素6的索引,如何查找呢?首先我们可以设定一个最大值max为数组的最后一个元素,6左边的元素均大于max,6右边的元素均小于max,为此进行二分查找,如果a[mid]<max,则此时mid位于6的右边,因此将high=mid;如果a[mid]>max,则说明此时mid在6的左边,将low=mid,于此同时将max=a[mid],如果a[mid]=max说明此时max=6,返回mid。
代码实现
int find_point(const int* a, const int n){int low = 0;int high = n-1;int max = a[n-1];while (low<high){int mid = (low+high)/2;if(a[mid] < max)high = mid;else if(a[mid] > max){max = a[mid];low = mid;}else{return mid;}}return -1;}
上述查找分界点的时间为O(logn)。找到分界点之后即可利用二分查找来查询目标元素。
代码实现
int binary_search(const int* a, int low, int high, int target){while (low<=high){int mid = (low + high)/2;if(a[mid] == target)return mid;else if(a[mid] > target)high = mid-1;elselow = mid+1;}return -1;}int find_target(const int* a, const int n,const int target){int point = find_point(a,n);if(point == -1)return -1;if(target >= a[0])return binary_search(a,0,point,target);elsereturn binary_search(a,point+1,n-1,target);}
测试代码
using namespace std;int find_point(const int* a, const int n);int binary_search(const int* a, int low, int high, int target);int find_target(const int* a, int n, int target);void main(){int a[] = {5,6,7,8,1,2,3,4};int n=8;for(int i=0; i<n; i++)cout<<a[i]<<" ";cout<<endl;int target;cout<<"Target: ";cin>>target;while(target>=0){cout<<"Location: "<<find_target(a,n,target)<<endl;cout<<"Target: ";cin>>target;}}仅供参考考,欢迎拍砖
0 0
- 排序旋转数组查找(Search in a sorted, rotated list)
- LeetCode @ Search in Rotated Sorted Array 旋转数组查找
- LeetCode @ Search in Rotated Sorted ArrayII 旋转数组查找II
- Search in Rotated Sorted Array-旋转数组的查找
- 查找已排序的旋转后的数组中的数(Search in Rotated Sorted Array)
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- [LintCode] 搜索旋转排序数组 Search in Rotated Sorted Array
- leetcode 刷题之路 35 Search in Rotated Sorted Array II (旋转排序数组查找终极版)
- Search in Rotated Sorted Array 旋转数组里查找数 @LeetCode
- LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
- Search in Rotated Sorted Array 在旋转的数组中查找元素
- Search in Rotated Sorted Array II 旋转的数组中查找,有重复元素
- Leetcode--Search in Rotated Sorted Array(旋转数组的查找)
- LeetCode | Search in Rotated Sorted Array(在旋转数组中查找)
- 【LeetCode刷题】旋转数组的查找 Search in Rotated Sorted Array
- Search in Rotated Sorted Array II 旋转数组二分查找 有重复
- leetcode 81. Search in Rotated Sorted Array II-旋转数组|二分查找
- LeetCode------33. Search in Rotated Sorted Array(旋转数组中查找)
- 程矢Axure夜话:中继器系列视频教程之中继器图片墙
- 程矢Axure夜话:中继器系列视频教程之中继器模糊搜索
- Databricks核心成员专访:感受Spark的蓬勃发展-2013
- 排序算法分析
- 逻辑回归详解及Python实现
- 排序旋转数组查找(Search in a sorted, rotated list)
- 程矢Axure夜话:中继器系列视频教程之中继器可折叠菜单
- STM32 ILI9325 驱动代码 学习总结 不断更新
- 程矢Axure夜话:中继器系列视频教程之中继器表格修改带图像数据
- html5开发之viewport使用
- Android编译环境的配置
- 让收藏、点赞的即时状态的交互正确的显示在ListView上
- 排序算法之插入排序
- JTAG各类接口针脚定义及含义