1.分析思路
这道题你要是看清楚它的本质了,其实就是一道二分查找变形的题目。旋转之后的数组实际上可以划分为两个子数组部分。左边的数组大小都大于或者等于右边的数组大小。而要找的最小元素就是右边数组的第一个元素。
2.方法一
从头选取数组元素将它与数组第一个元素相减的值记为P1,将当前选取的数组元素减去当前选取数组加一的元素值记为P2.如果P1小于P2,则当前选取数组加一的元素即为最小值。f否则,一直循环下去。如果循环到最终,都是P1小于P2,则直接返回第一个元素,它即为最小。代码如下:
class Solution {
public:
int minNumberInRotateArray(vector
rotateArray)
{
int size=rotateArray.size();
if(size==0)
return 0;
for(int i=0;i
hash;
for(int i = 0;i
= 0)
cnt++;
while(cnt == t.size())
{
if(r-l+1
0)
cnt--;
}
l++;
}
}
}
if(minlen == INT_MAX)
return ";
return s.substr(minl,minlen);
}
}
3.方法二
找到数组的中间元素。
中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。移动之后,第一个指针仍然位于前面的递增数组中。中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。移动之后,第二个指针仍然位于后面的递增数组中。这样可以缩小寻找的范围。
class Solution {
public:
int minNumberInRotateArray(vector
rotateArray) {
int size = rotateArray.size();
if(size == 0){
return 0;
}
int left = 0,right = size - 1;
int mid = 0;
while(rotateArray[left] >= rotateArray[right]){
if(right - left == 1){
mid = right;
break;
}
mid = left + (right - left) / 2;
if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){
return MinOrder(rotateArray,left,right);
}
if(rotateArray[mid] >= rotateArray[left]){
left = mid;
}
else{
right = mid;
}
}
return rotateArray[mid];
}
private:
int MinOrder(vector
&num,int left,int right){
int result = num[left];
for(int i = left + 1;i < right;++i){
if(num[i] < result){
result = num[i];
}
}
return result;
}
};