• 《剑指offer》面试题8—旋转数组的最小数字


    题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转。要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字。例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。

    思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。

    例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int MinInOrder(int* array, int index1, int index2)
     6 {
     7     int min = array[index1];
     8     for(int i=index1+1; i<=index2; i++)
     9     {
    10         if(array[i] < min) min = array[i];
    11     }
    12     return min;
    13 }
    14 
    15 int Min(int* array, int length)
    16 {
    17     int index1 = 0;
    18     int index2 = length - 1;
    19     int index_mid = index1;
    20 
    21     if(array[index1] < array[index2])
    22         return array[index1];
    23     else
    24     {
    25         while((index2 - index1) > 1)
    26         {
    27             index_mid = (index2 + index1)/2;
    28             if(array[index1] == array[index2] == array[index_mid])
    29                 return MinInOrder(array,index1,index2);
    30             else if(array[index1] <= array[index_mid])
    31                 index1 = index_mid;
    32             else
    33                 index2 = index_mid;
    34         }
    35     }
    36     return (array[index1]<array[index2])?array[index1]:array[index2];
    37 }
    38 
    39 
    40 int main()
    41 {
    42     int length;
    43     cout<<"Input the array's length:"<<endl;
    44     cin>>length;
    45     int* parray = new int[length];
    46     for(int i=0; i<length; i++)
    47     {
    48         cin>>parray[i];
    49     }
    50     cout<<"The min number in array:"<<Min(parray,length)<<endl;
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    二十四种设计模式:观察者模式(Observer Pattern)
    二十四种设计模式:工厂方法模式(Factory Method Pattern)
    Java迷题:等于,还是不等于?
    UCenter创始人、Discuz!创始人、管理员账号的认知(转)
    Internet Explorer 无法启用 JavaScript 怎么办?
    IIS配置PHP环境(快速最新版)(转载+自创)
    零基础学php的自学
    PHP实体层基础类
    PHP数据库链接类(PDO+Access)
    C# Memcached 缓存
  • 原文地址:https://www.cnblogs.com/CnZyy/p/3311067.html
Copyright © 2020-2023  润新知