【剑指offer】36.旋转数组的最小数字
总目录:
1.问题描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度:O(logn)
2.问题分析
1二分,舍弃不必继续计算的一半,注意兜住边界条件如中值与首尾值相等、首值直接就小于尾值的情况
3.代码实例
二分
1 class Solution { 2 public: 3 const int max = 10000; 4 int getMin(vector<int>& data, int start, int end) { 5 //保护条件 6 int dataSize = data.size(); 7 if (dataSize <= 0) { 8 return max; 9 } 10 //序号异常 11 if (start > end) { 12 return max; 13 } 14 //首值直接小于尾值 15 if (data[start] < data[end]) { 16 return data[start]; 17 } 18 //仅剩下2个以内的数值作比较,直接比大小 19 if (end - start <= 1) { 20 return data[start] < data[end] ? data[start] : data[end]; 21 } 22 23 //寻找前比后大的部分,继续递归 24 int mid = (start + end) / 2; 25 int part1 = data[start] >= data[mid] ? getMin(data, start, mid) : data[start]; 26 int part2 = data[mid] >= data[end] ? getMin(data, mid, end) : data[mid]; 27 28 return part1 < part2 ? part1 : part2; 29 } 30 31 int minNumberInRotateArray(vector<int> rotateArray) { 32 return getMin(rotateArray, 0, rotateArray.size() - 1); 33 } 34 };