zoukankan      html  css  js  c++  java
  • 《剑指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
  • 相关阅读:
    MySQL max_allowed_packet设置及问题
    centos 7 编译安装mysql 详细过程
    如何快速查看mysql数据文件存放路径?
    centos yum 库更新
    centos 7 ifconfig 命令找不到
    http协议
    前端那些事儿
    C++接口的定义与实现的详细过程
    List转为字符串
    spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
  • 原文地址:https://www.cnblogs.com/CnZyy/p/3311067.html
Copyright © 2011-2022 走看看