剑指Offer旋转数组的最小数字
Posted xiexinbei0318
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer旋转数组的最小数字相关的知识,希望对你有一定的参考价值。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组3,4,5,1,2为1,2,3,4,5的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
我原本看不太懂题目,直到看了一下题解,说是数组包含两个递增排序的子序列
大概的意思就是说,数组是递增的,但是第一个不是最小的。
例如1,2,3,4,5
它的旋转数组可以是:5,1,2,3,4 4,5,1,2,3 3,4,5,1,2
也有特例:例如0,1,1,1,1它的旋转数组有1,0,1,1,1 1,1,0,1,1 1,1,1,0,1
A:使start指向数组头,end指向数组尾,mid指向数组中间
若mid 大于等于 start,则mid还在第一个递增序列中,将start置为mid
若mid 小于等于 end,则mid在第二个递增序列中,将end置为mid
若为特例,则start == end == mid此时只能用顺序查找的方法
class Solution public: int minNumberInRotateArray(vector<int> rotateArray) if(rotateArray.empty()) return 0; int start = 0; int end = rotateArray.size() - 1; int mid = 0; while(rotateArray[start] >= rotateArray[end]) //找中值mid if(end - start == 1) mid = end; break; mid = (start + end) / 2; //若start,end,mid指向数字相同,则顺序查找 if((rotateArray[start] == rotateArray[end]) && (rotateArray[start] == rotateArray[mid]) ) int ret = rotateArray[start]; for(int i = start + 1; i <= end; i++) if(ret > rotateArray[i]) ret = rotateArray[i]; return ret; //中值 >= 左值,左值 = 中值 if(rotateArray[mid] >= rotateArray[start]) start = mid; //中值 <= 右值,右值 = 中值 else if(rotateArray[mid] <= rotateArray[end]) end = mid; return rotateArray[mid]; ;
相关题目:
回文数组
查找第K大的元素
以上是关于剑指Offer旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章