求旋转有序数组的最小值和在旋转数组中查找

#include<iostream>

using namespace std;

int find2(int A[],int n)
{
  int high=n-1;
  int low =0;
  int mid;
  while(A[high]<=A[low])
  {
    if(high-low==1)
    {
         mid=high;
         break;
    }
    mid=low+(high-low)/2;
    if(A[mid]>=A[low])
    {
     low=mid;
    }else if(A[mid]<=A[high]){
       high=mid;
    }

  }
   return A[mid];
}
int find(int A[],int n,int value)
{
  int low=0;
  int high=n-1;
  int mid;
  while(low<=high)
  {
   mid=low+(high-low)/2;
   if(A[mid]==value)
    return mid;
   if(A[low]<=A[mid])//左边有序
   {
     if(A[mid]>value&&value>=A[low])
     {
       high=mid-1;
     }else{
       low=mid+1;
     }
   }else if(A[mid]<=A[high])//右边有序
   {
       if(A[mid]<value&&A[high]>=value)
       {
        low=mid+1;
       }else{
        high=low-1;
      }
   }

  }
return (A[mid]==value) ? mid : -1;
}
int main()
{
    int a[]={4,5,6,1,2,3};
    cout<<find(a,6,3)<<endl;
    cout<<find2(a,6)<<endl;
}

时间: 2024-10-13 12:06:48

求旋转有序数组的最小值和在旋转数组中查找的相关文章

[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

Find Minimum in Rotated Sorted Array 2 寻找旋转有序数组的最小值之二

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

旋转数组中查找最小值-剑指Offer11

1.题目简介 求一个旋转数组的最小值.( 把一个数组从最开始的若干个元素搬到数组的末尾,即为旋转数组.) 输入:一个递增排序数组的旋转 输出:数组的最小值 例子:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 2.思路分析 最直观的解法是从头到尾顺序遍历,这种方法的时间复杂度为O(n).这里并没有用到旋转数组的知识,显然不合题意. 结合提议,旋转数组从有序数组中的得来的,经过旋转后得到的两个部分也为有序的.在有序数组中查找首选二分法,可以把时间复杂度变为O(n

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

查找旋转数组的最小值

查找旋转数组的最小值: 假设一个排序数组以某个未知元素为支点做了旋转,找出旋转后数组中的最小值,假定数组中没有重复元素. 如:原数组1,2,3,4,5,6,7旋转后得到4,5,6,7,1,2,3.旋转后的最小值为1. 问题分析: 这里不做过多的介绍,旋转之后的数组实际上可以划分为两个有序的数组,前面子数组的大小大于后面子数组的大小. 最小的元素就是两个数组的分界线. 程序实现: 1 /*************************************** 2 FileName FindM

剑指offer:旋转数组的最小值

题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. class Solution: """ 由于整个数组在一定程度上是有序的,因此可以借鉴二分查找的思想,达到接近O(logn)的时间复杂度. 将一个有序(升序)数组的前x个元素挪到末尾,这里可以分

旋转数组的最小值

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 1 class Solution { 2 public: 3 int minNumberInRotateArray(vector<int> rotateArray) { 4 if(rotateArray.empty()) 5 return 0; 6 int index1 = 0;

java-第七章-数组-求出一些数的最小值

import java.util.Scanner; public class A04 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); double[] Price = new double[4]; double min = 0; System.out.println("请输入4家店的价格"); for

17、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. eg: 输入 3 4 5 1 2 输出 1 思路:用二分法查找最小元素 三种情况: (1)rotateArray[mid] >rotateArray[high]: like:[x,x,x,6,x,x,2],此时最小数字一