一聚教程网:一个值得你收藏的教程网站

热门教程

C++中求旋转数组中的最小数字(经典面试题)

时间:2022-06-25 02:56:43 编辑:袖梨 来源:一聚教程网

面试题:旋转数组的最小数字

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

算法:

(1)当输入的旋转数组非法时:处理!
(2)当输入的旋转数组正常时,index1 = 0;index2=length-1:

   a:如果arry[index1]   b:如果arry[index1] >= arry[index2]时,middle = (index1+index2)/2:

       b.1如果arry[index1] >arry[middle],index2 = middle;
       b.2如果arry[index1] <= arry[middle],index1 = middle;
       b.3 如果arry[index1] = arry[middle] = arry[index2],遍历找到最小值。

代码:

 

 代码如下复制代码

Min_RotateArray.hpp

#pragma once

#include

usingnamespacestd;

  

intMin_RotateArray(intarry[],intsize)

{

  if(arry == NULL || size <= 0)

  {cout<<"参数输入错误!!!"<

  intmin = 0;

  intindex1 = 0;

  intindex2 = size-1;

  intmiddle = (index1+index2)/2;

  if(arry[0] < arry[size-1])

    returnarry[0];

  while(arry[index1] >= arry[index2])

  {

    if(index2-index1 == 1)

    {

      min=index2;

      break;

        

    }

    middle = (index1+index2)/2;

    if(arry[index1] <= arry[middle])//arry[middle]还在第一个递增序列中

    {

      index1 = middle;

    }

    else            

    {

      if(arry[index1] >= arry[middle])//arry[middle]在第二个递增序列中

      {index2 = middle;}

        

      if(arry[index1] == arry[index2] && arry[index1] == arry[middle])

      {

        for(inti=0;i

        {

          if(arry[min]>arry[i])

            {

              min = i;

              break;

            }

        }

  

      }

    }

  }

  returnarry[min];

}

Min_RotateArray.cpp

#include"Min_RotateArray.hpp"

  

intmain()

{

  intarry[] = {3,4,5,1,2};

  intsize =sizeof(arry)/sizeof(arry[0]);

  intmin = Min_RotateArray(arry,size);

  cout<<"The min is:"<

  system("pause");

  return0;

}

 

热门栏目