在一个循环有序数组里查找一个给定的值是否存在
来源:互联网 发布:淘宝服务市场无线端 编辑:程序博客网 时间:2024/04/30 02:30
题目:
一个循环有序数组(如:3,4,5,6,7,8,9,0,1,2),不知道其最小值的位置,要查找任一数值的位置。要求算法时间复杂度为log2(n)。
思路:
我们可以把循环有序数组分为左右两部分(以mid = (low+high)/ 2为界),由循环有序数组的特点知,左右两部分必有一部分是有序的,我们可以找出有序的这部分,然后看所查找元素是否在有序部分,若在,则直接对有序部分二分查找,若不在,对无序部分递归调用查找函数。
二分查找
#include <iostream> using namespace std; int binarySearch(int a[],int low,int high,int value) //二分查找 { if(low>high) return -1; int mid=(low+high)/2; if(value==a[mid]) return mid; else if(value>a[mid]) return binarySearch(a,mid+1,high,value); else return binarySearch(a,low,mid-1,value); } int Search(int a[],int low,int high,int value) //循环有序查找函数 { int mid=(low+high)/2; if(a[mid]>a[low]) //左有序 { if(a[low]<=value && value<=a[mid] ) //说明value在左边,直接二分查找 { return binarySearch(a,low,mid,value); } else //value在右边 { return Search(a,mid+1,high,value); } } else //右有序 { if(a[mid]<=value && value<=a[high]) { return binarySearch(a,mid,high,value); } else { return Search(a,low,mid-1,value); } } } int main() { int a[]={3,4,5,6,7,8,9,0,1,2}; cout<<Search(a,0,9,0)<<endl; return 0; }
def CycleBSearch(arr, val): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) / 2 if val == arr[mid]: return mid # found val if arr[left] <= arr[mid]: if arr[left] <= val < arr[mid]: right = mid - 1 # val is in left side else: left = mid + 1 # val is in right side else: if arr[left] > val > arr[mid]: left = mid + 1 # val is in right side else: right = mid - 1 # val is in left side return -1 # cannot find val
阅读全文
0 0
- 在一个循环有序数组里查找一个给定的值是否存在
- 在一个循环有序的数组里查找特定值
- 在一个有序的旋转数组中,查找给定值
- 算法9:在一个循环有序的数组里查找一个数
- 给定一个数组,从中查找是否存在两个数的和等于一个给定的x
- 给定一个数组和一个数字,给定的数组里是否存在两个数字之和等于给定的数字
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1,假定数组存在重复元素
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1
- 求一个值是否是一个给定有序数组中两个元素的和
- 在一个按行列递增的二维数组中查找一个数是否存在
- 循环有序数组查找一个数
- 查找一个数是否存在于一个数组中。该数组分两段有序,第一段的数都大于第二段的数。
- 在一个二维数组中判断给定整数是否存在,要求在O(n)内实现
- 判断一个有序数组中是否有两个数的和等于给定的数
- 给定一个递增有序数组,要求构建一棵具有最小高度的二叉查找树
- 在一个两段有序的数组中查找
- 在有序递增数组中查找一个缺少的数字
- 美团外卖、饿了么竞品分析
- bingfa
- 收集一些不错的GitHub轮子
- 安卓studio环境错误,无法打开
- SolrCloud原理介绍
- 在一个循环有序数组里查找一个给定的值是否存在
- 内存泄漏的问题之av_bitstream_filter_filter
- java 定时任务 Timer TimerTask
- view
- iOS控制器瘦身-面向超类编程
- H5开发具有哪些优势?
- Spark中Utils.getCallSite()的作用
- Isolation Forest算法原理详解
- TP下页面通过Ajax获取控制器中的数据