标签:star 技术 solution 大于等于 最小 输出 题解 pre cto
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{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大的元素
标签:star 技术 solution 大于等于 最小 输出 题解 pre cto
原文地址:https://www.cnblogs.com/xiexinbei0318/p/11409922.html