题目描述
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:根据题目特点,我们可以看到这个旋转将数组分成了两段 {345}一段,{12}一段。我们要求的是在第二段(如果有)的第一个数字。所以可以用两个指针指向首位数字,然后再取中间位次的数,判断这个数和尾部数字大小
- 如果,a[mid]>a[tail] ,说明了这个中间的数是处于第一段里面。否则就处于第二段里面
- 如果是和最后一个数字相等,并且和第一个数字相等 ,此时应该顺序查找。
- 如果和最后一个数字相等,并且a[mid] < a[head],那么end=mid,最小值在前部分。(因为第一个数小于最后一个数的情况一开始就被排除了所以不考虑)
【并且注意】在你用求中值时候,对于两个相邻的两个数,mid是一定等于前面那个数!
ps: 如果是在笔试,并且要求没有不能用sort函数,就用快速排序函数 ,输出数组第一个数字
代码
这种解法有问题,就是没有考虑当出现的数字都一样,最小那个数在前或后的情况
int minNumberInRotateArray(vector<int> rotateArray) {
if(rot