11.旋转数组的最小数字

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

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。


例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。


解法一:


使用二分查找实现

c5aaa6083a4ed6abfcb2cb207a16cbfe_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png



分为两部分:前一个递增子数组 后一个递增子数组  ;两个指针分别指向第一个和最后一个;选择中间的位置元素比较它是属于第一个子数组还是第二个子数组(若是大于第一个元素则是属于第一个子数组,否则小于最后一个元素则是属于第二个子数组)


特殊情况:


三个元素都相同时,第一个 、中间 、最后一个

0f01f4ed3fccb5173f482b08ffe9b68e_20190131234759853.png


采用顺序查找实现。



class Solution {

public:

   int minNumberInRotateArray(vector<int> rotateArray) {

       int size = rotateArray.size();

       if(size == 0){

           return 0;

       }//if

       int left = 0,right = size - 1;

       int mid = 0;

       // rotateArray[left] >= rotateArray[right] 确保旋转

       while(rotateArray[left] >= rotateArray[right]){

           // 分界点

           if(right - left == 1){

               mid = right;

               break;

           }//if

           mid = left + (right - left) / 2;

           // rotateArray[left] rotateArray[right] rotateArray[mid]三者相等

           // 无法确定中间元素是属于前面还是后面的递增子数组

           // 只能顺序查找

           if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){

               return MinOrder(rotateArray,left,right);

           }//if

           // 中间元素位于前面的递增子数组

           // 此时最小元素位于中间元素的后面

           if(rotateArray[mid] >= rotateArray[left]){

               left = mid;

           }//if

           // 中间元素位于后面的递增子数组

           // 此时最小元素位于中间元素的前面

           else{

               right = mid;

           }//else

       }//while

       return rotateArray[mid];

   }

private:

   // 顺序寻找最小值

   int MinOrder(vector<int> &num,int left,int right){

       int result = num[left];

       for(int i = left + 1;i < right;++i){

           if(num[i] < result){

               result = num[i];

           }//if

       }//for

       return result;

   }

};

目录
相关文章
|
6月前
|
Java
【剑指offer】-旋转数组的最小数字-06/67
【剑指offer】-旋转数组的最小数字-06/67
|
6月前
每日一题——旋转数组的最小数字(II)
每日一题——旋转数组的最小数字(II)
剑指offer-10.旋转数组最小的数字
剑指offer-10.旋转数组最小的数字
58 0
旋转数组的最小数字
旋转数组的最小数字
47 0
|
算法
剑指offer 10. 旋转数组的最小数字
剑指offer 10. 旋转数组的最小数字
55 0
剑指offer_数组---旋转数组的最小数字
剑指offer_数组---旋转数组的最小数字
42 0
|
算法 Java
旋转数组的最小数字(剑指offer 11)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
旋转数组的最小数字(剑指offer 11)
使用二分法解决旋转数组的最小数字的问题
使用二分法解决旋转数组的最小数字的问题
92 0
使用二分法解决旋转数组的最小数字的问题
旋转数组的最小数字(简单难度)
旋转数组的最小数字(简单难度)
74 0
旋转数组的最小数字(简单难度)
|
前端开发 测试技术 程序员
寻找旋转数组中的最小数字
寻找旋转数组中的最小数字
寻找旋转数组中的最小数字