CI9.3-旋转数组查找给定值
来源:互联网 发布:linux怎么删除目录 编辑:程序博客网 时间:2024/04/26 12:26
给定一个旋转了任意次的有序数组A和一个数n,实现一个O(logn)的算法返回n在A中的下标,若没有返回-1。(假定原有序数组是递增的)
例子:
输入:A:15,16,19,20,25,1,3,4,5,7,10,14;n:5
输出:8
思路:
有序数组旋转之后,前半部分仍是有序的,后半部分无序,仍然可以用二分的思想。
如果a[mid] == n,结束。
如果a[mid] > n,有两种情况:
1、如果a[mid] > a[left],说明前半段有序:那么如果a[left] > n则n在后半段,否则在前半段;
2、如果a[mid] < a[left],说明后半段有序:那么n在前半段。
如果a[mid] < n,情况类似。
该思路只适合没有重复数字的情况,如果有重复数字只有顺序查找了。
#include <iostream>#include <vector>using namespace std;int Search(const vector<int>& v, int a){int l = 0, r = v.size() - 1;int m;while (l <= r){m = l + ((r - l) >> 1);if (a == v[m])return m;else if (a < v[m]){if (v[l] < v[m]){if (a < v[l])l = m + 1;elser = m - 1;}elser = m - 1;}else if (a > v[m]){if (v[l] < v[m])l = m + 1;else{if (a < v[l])l = m + 1;elser = m - 1;}}}return -1;}int main(){vector<int> v;int n;cin >> n;while (n--){int m;cin >> m;v.push_back(m);}cin >> n;cout << Search(v, n) << endl; return 0;}
- CI9.3-旋转数组查找给定值
- 在一个有序的旋转数组中,查找给定值
- CI9.5-特殊字符串数组的二分查找
- 二维数组中查找给定值
- 二维有序数组查找给定值
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- CI9.1-合并有序数组
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1,假定数组存在重复元素
- 【算法题】查找旋转数组的值
- 旋转数组查找
- 旋转排序数组查找
- 旋转数组的查找
- 旋转数组查找
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1
- 查找数组中和为某给定值的两个数
- 查找数组中和为某给定值的三元组
- 查找有序数组中等于给定值的两个数
- 在给定数组中查找两个数的和为给定值sum
- StringUtils详细介绍
- android:屏幕自适应
- auto,register,static分析
- 10进制转换16进制
- asp.net开发常用技巧收集
- CI9.3-旋转数组查找给定值
- extjs动态树的生成。
- 易语言POST教程-CSDN上传头像解析
- hibernate session译文
- Sublime text 3/2破解版_破解方法_注册机_序列号_下载
- ARM926EJ-S/ARM920T 协处理器 CP14, CP15详解
- 会话管理
- hdu1335(进制之间的转换)
- eclipse中的输入提示怎么设置 让它为我们提示所有的输入呢?