zoukankan      html  css  js  c++  java
  • 【剑指offer】06 旋转数组的最小数字

    题目地址:旋转数组的最小数字

    题目描述                                   

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
    输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
    NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 64M,其他语言128M

    题目示例                                   

    输入:
    [3,4,5,1,2]
    返回值:
    1

    解法分析                                   

    先说明一下定义,非递减意为a[i]<=a[i+1],递减意为a[i]>a[i+1],非递增意为a[i]>=a[i+1],递增意为a[i]<a[i+1],因此非递减排序的数组类似[1,2,3,4,4,5,6,6]这种。

    而旋转后的非递减排序的数组,形如[4,4,5,6,6,1,2,3],可看出分为了左右两部分,而右侧(尾部)部分的最左侧元素即为数组中的最小数。因此我们只需要对比相邻两元素的大小,一旦满足a[i]>a[i+1],即左侧元素大于右侧元素,a[i+1]就是数组中的最小值。

    然而这种方式过于简单,并且时间复杂度为O(n),更好的方法应该是使用二分法,可将时间复杂度降为O(logn)。

    代码                                         

     1 function minNumberInRotateArray(rotateArray)
     2 {
     3     // write code here
     4     if(rotateArray.length===0){
     5         return 0
     6     }
     7     var fir = 0;
     8     var las = rotateArray.length - 1;
     9     while(las - fir > 1){
    10         var mid = Math.floor((fir+las)/2);
    11         if(rotateArray[mid] < rotateArray[las]){
    12             las = mid;
    13         }else{
    14             fir = mid
    15         }
    16     }
    17     return Math.min(rotateArray[fir],rotateArray[las]);
    18 }

    执行结果                                   

  • 相关阅读:
    关于数据库中浮点运算、保留小数和时间计算
    几个常用的操作
    数字转换为字符串
    Dll控件出错的处理办法
    小巧的服务程序源码(转)
    DELPHI中MDI子窗口的关闭和打开
    用Delphi创建服务程序
    Delphi如何获取QQ2010聊天窗口句柄?
    拖动Form上的图片,Form一起动
    仿药易通输入单位信息后如果没有则自动加入功能
  • 原文地址:https://www.cnblogs.com/sunlinan/p/14204752.html
Copyright © 2011-2022 走看看