zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

     问题描述:

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

     解题思路:

    一定的有序数组查找,首先采用二分,数组数据的分布为下图所示,找旋转数组的最小值,即找中间那条垂直线

                       

    1、满足第一个if的点在竖直线右侧,且二分的端点在竖直线两侧

    2、满足第二个if的点在竖直线左侧,且二分的端点在竖直线两侧

    3、满足第三个if的点说明二分的端点在同一侧

    这里,如果没有旋转的话,整个数组是有序的,那么,始终会进入第3个if,即成为二分查找。

     代码:

     1 class Solution {
     2 public:
     3     int minNumberInRotateArray(vector<int> rotateArray) {
     4         int l = 0;
     5         int h = rotateArray.size() - 1;
     6         return findmin(rotateArray,l,h);
     7     }
     8     int findmin(vector<int> rotateArray,int l,int h)
     9     {
    10         while(1)
    11         {
    12             int m = (l + h) / 2;
    13             if(rotateArray[m] <= rotateArray[l] && rotateArray[m] <= rotateArray[h])
    14             {
    15                 h = m;
    16             }
    17             if(rotateArray[m] >= rotateArray[l] && rotateArray[m] >= rotateArray[h])
    18             {
    19                 l = m;
    20             }
    21             if(rotateArray[m] >= rotateArray[l] && rotateArray[m] <= rotateArray[h])
    22             {
    23                 h = m;
    24             }
    25             if(l + 1 == h)
    26             {
    27                 return (rotateArray[l] < rotateArray[h])?rotateArray[l] : rotateArray[h];
    28                 break;
    29             }
    30         }
    31         
    32     }
    33 };
  • 相关阅读:
    Django-ORM
    深入理解vue 修饰符sync
    PS切图
    用Chrome 浏览器调试移动端网页 chrome://inspect/#devices
    float浮动导致父元素高度坍塌的原因及清除浮动方法
    vue keep-alive
    ES6 箭头函数
    ES6 Module(模块)
    MVC模式 和 MVVM模式
    移动端适配代码
  • 原文地址:https://www.cnblogs.com/wktwj/p/8576330.html
Copyright © 2011-2022 走看看