【剑指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 };
View Code
posted @ 2022-11-18 17:28  啊原来是这样呀  阅读(21)  评论(0编辑  收藏  举报