旋转有序数组的二分查找

要求

   给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1)。

例子

有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋、右旋效果相同)。

  • 查找元素5,返回结果2;
  • 查找元素8,返回结果-1。

分析

  可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果;利用有序的特点,可以轻易的想到二分查找的方法。经过旋转后的数组总是可以分为两个有序序列,如下图所示。旋转数组分成了红蓝两段有序序列。

  可以看出中间位置m(m‘)的两边必然有一个是有序的,如果是m则左边有序;如果是m‘则右边有序;如下可以看出。

  总结规律:每次根据L和R求出m后,m左边[L, m-1]和右边[m+1, R]这两部分中至少一个是有序的。

       (1)arr[m]=X,返回m

       (2)arr[m]<arr[R],位于m‘位置右侧是有序的;当arr[m‘]<X<arr[R]时,则L=m‘+1,否则R=m‘-1。

       (3)arr[m]>=arr[R],位于m位置左侧是有序的;当arr[L]<X<arr[m]时,则R=m-1,否则L=m+1。

参考代码

时间: 2024-10-24 12:01:40

旋转有序数组的二分查找的相关文章

有序数组的二分查找

二分查找的优点是比较次数少,查找速度快,但是在查找之前必须建立有序表.另外,二分查找只适用于顺序存储的有序表,而不适用于链接存储的有序表. 假设:给定一个按从小到大排序的数组P,对分查找某个元素的位置. 二分查找的过程为首先将x和数组的中间项进行比较,若x小于中间项的值,则在线性表的前半部分进行二分查找:若x大于中间项的值,则在线性表的后半部分进行二分查找:若x等于中间项的值,则查找结束.若待二分的子表长度为0时仍然没有找到这个元素,则说明数组中没有x. java代码 <span style=&qu

hiho1128 非有序数组的二分查找 (快速排序)

链接: hihocoder1128 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1000050]; int _sort(int left,int right) { int x=a[left]; while(left<right) { while(a[right]>x&&left<right) right--; i

(算法)旋转有序数组中查找某个数

题目: 假设有个有序数组在某个位置旋转,得到新的数组,即为旋转有序数组.如:(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). 现给定一个这样的数组,在数组中查找某个数.如果找到,返回下标,否则返回-1: 思路: 思路1: 考虑一个旋转有序数组的特点:前面部分是递增的,后面部分也是递增的,即先后两部分都为递增有序数组,因此可以用二分查找来做. 假设数组为A,下标从left到right,查找的数字为target,那么mid=(left+((right

爪哇国新游记之二十七----数组的二分查找

代码: import java.util.ArrayList; import java.util.List; public class Bit { int max; int min; int[] arr; public Bit(int[] arrInput) { // 找出极值 for (int i = 0; i < arrInput.length; i++) { if (max < arrInput[i]) { max = arrInput[i]; } if (min > arrInp

[LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II

Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would this affect the run-time complexity? How and why? Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might be

二分查找 数组的二分查找

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 1083: 数组的二分查找 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1646  Solved: 641[Submit][Status][Web Board] Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output 一个整数(表示x的位置,若

【每日一算】旋转有序数组

在旋转有序数组中找出给定的一个整数,并返回该整数在数组中的下标? //常规有序数组 int[] arr1 = {1,2,3,4,5} //旋转有序数组 int[] arr2 = {50,60,70,80,20,30,40} 解题思路: 假设最左边下标用left标识,最右边下标有right标识,中间整数下标用mid标识; 每次判断下标mid对应的整数值是否大于下标left对应整数值,如果大于,说明左边有序,如果小于,说明右边有序; 在上一步的基础上,如果左边有序,判断目标值target实在左边还是

旋转数组的二分查找

问题描述:已知有序数组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 #include "stdafx.h" 2 3 int search(int *a, int key, int low, int high) 4 { 5 if (low > high) 6 return -1;

[Leetcode] search in rotated sorted array 搜索旋转有序数组

Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e.,0 1 2 4 5 6 7might become4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no duplicate