• 旋转数组的最小数字


     1 #include "stdafx.h"
     2 #include <iostream>
     3 #include <exception>
     4 #include <stack>
     5 using namespace std;
     6 
     7 /*
     8 旋转数组的最小数字
     9 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入
    10 一个递增排序的数组的一个旋转。输出旋转数组的最小元素。例如数组{3,4,5,1,2}
    11 为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
    12 思路:遍历一遍找最小值.时间复杂度显然是O(n),这个思路显然达不到要求.
    13 */
    14 
    15 int Min(int *arr,int beg,int end)
    16 {
    17     
    18     if(arr==NULL)
    19         throw new std::exception("Invalid parameters");
    20     if(arr[beg]<arr[end])
    21     {
    22         return arr[beg];
    23     }
    24 
    25     int mid =(beg+end)/2;
    26     if(arr[mid]==arr[beg]&&arr[beg]==arr[end])
    27     {
    28         int result = arr[beg];
    29         for(int i = beg;i<=end;i++)
    30         {
    31             if(result>arr[i])
    32                 result = arr[i];
    33         }
    34         return result;
    35     }
    36     if(beg+1==end)
    37     {
    38         return arr[end];
    39     }
    40     
    41     if(arr[mid] < arr[beg])
    42     {
    43         return Min(arr,beg,mid);
    44     }
    45     if(arr[mid] > arr[end])
    46     {
    47         return Min(arr,mid,end);
    48     }
    49     return -1;
    50 }
    51 
    52 int _tmain(int argc, _TCHAR* argv[])
    53 { 
    54     int arrlist[] = {2,3,4,5,6,7,1};
    55     //int arrlist[] = {1,0,1,1,1};
    56     //int arrlist[] = {1,1,1,0,1};
    57     int len = sizeof(arrlist)/sizeof(int);
    58     cout<<Min(arrlist,0,len-1)<<endl;
    59     return 0 ;
    60 }
  • 相关阅读:
    准备重启blog。。。
    愿我成功省一。
    [LUOGU]P5502 [JSOI2015]最大公约数
    [LUOGU]P3400 仓鼠窝
    [LUOGU]P5149 会议座位
    OI退役记
    新开博客园~~
    1108 模拟赛
    牛客1102
    题解 CF21B 【Intersection】
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3558658.html
Copyright © 2020-2023  润新知