Find Minimum in Rotated Sorted Array
原题(源自:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/):
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element. You may assume no duplicate exists in the array。
1.直接裸算o(n)可以测试通过,代码如下:
class Solution {
public:
int findMin(vector<int> &num) {
int n = num.size();
for(int i = 0;i < n - 1;i ++)
{
if(num[i] > num[i+1])
return num[i+1];
}
return num[0];
}
};
所以原题原意就是2个递增序列合并,注意没有相同元素,很简单。
2.折半查找o(logn)代码如下:
class Solution {
public:
int findMin(vector<int> &num) {
int left = 0;
int right = num.size() - 1;
while(left < right)
{
int mid = (left + right)/2;
if(num[left] < num[right])
return num[left];
if(num[mid] >= num[left])
{
left = mid + 1;
}
else
right = mid;
}
return num[left];
}
};
大致分析如下:(注意两个递增序列不能交叉重叠,且没有特殊的中间元素,所以必有 序列1<序列2或序列1>序列2)
如果 num[left]<=num[mid] && num[mid]<num[right] 则 第一个元素就是所找
如果 num[left]<=num[mid] && num[mid]>num[right] 则 left = mid + 1;
如果 num[left]> num[mid] && num[mid]<num[right] 则 right = mid;
如果 num[left]> num[mid] && num[mid]>num[right] 则 不可能;
之后的子情况要么变成一个递增序列,此时就和上面第一种情况是一样的;要么仍然为2个递增序列合并,则和父情况一样。


浙公网安备 33010602011771号