求解旋转数组的最小数字

2025-05-27 0 92

求解旋转数组的最小数字

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小数组。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的旋转数组,该数组的最小值为1。

思路解析:

O(N)的算法

这种算法的思想就是遍历这个数组,由于这个数组是两部分有序的数组,因此遍历这个数组时当后一个数字小于前一个数字时,则后一个(即较小)一定为整个数组中最小的数字。

这种算法的思想很简单,但就是时间复杂度较大,因此不是很好的算法。

?

1

2

3

4

5

6

7

8

9

10

11

12

13
int minNumberInRotateArray(vector<int> rotateArray)

{

if (rotateArray.empty())

return -1;

unsigned int i=0;

for (; i<rotateArray.size()-1; i++)

{

if (rotateArray[i] > rotateArray[i+1])

break;

}

return rotateArray[i+1];

}

O(logN)的算法

这种算法思想类似于二分查找,首先每次找到数组中中间的数字mid,如果mid大于最左端left,说明最小数在mid的右侧区间,则改变left,置left为mid;如果mid小于数组右侧right,说明最小数在mid的左侧区间,则改变right为mid….当left的数字小于等于right的数字时,说明已经找到最小数,这个也是循环结束的条件

求解旋转数组的最小数字

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26
int minNumberInRotateArray(vector<int> rotateArray)

{

if (rotateArray.empty())

return -1;

unsigned int left=0;

unsigned int right=rotateArray.size()-1;

unsigned int mid=left;

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

{

if (right-left == 1)

{

mid = right;

break;

}

mid = left+((right-left)>>1);

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

return rotateArray[mid];

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

left = mid;

else if (rotateArray[mid] <= rotateArray[right])

right = mid;

}

return rotateArray[mid];

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 求解旋转数组的最小数字 https://www.kuaiidc.com/74064.html

相关文章

发表评论
暂无评论