旋转数组的最小数字

 问题描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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 };

 

posted @ 2018-03-15 21:11  康小武  阅读(179)  评论(0编辑  收藏  举报