题目:
Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
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.
The array may contain duplicates.
题解:时间复杂度会退化为O(n),因为有可能low = mid = high,这时候只能low = low + 1,最坏情况所有元素都相等,需要扫描所有元素才能求出最小值。
c++版:
class Solution {
public:
int findMin(vector<int> &num) {
if(!num.size())
return num[0];
int low = 0, high = num.size()-1;
while(low < high && num[low] >= num[high]) {
int mid = (low + high) / 2;
if(num[low] > num[mid])
high = mid;
else if(num[mid] > num[high])
low = mid + 1;
else
low = low + 1;
}
return num[low];
}
};
Java版:
public class Solution {
public int findMin(int[] num) {
if(num.length == 1)
return num[0];
int low = 0, high = num.length-1;
while(low < high && num[low] >= num[high]) {
int mid = (low + high) / 2;
if(num[low] > num[mid])
high = mid;
else if(num[mid] > num[high])
low = mid + 1;
else
low = low + 1;
}
return num[low];
}
}
Python版:
class Solution:
# @param num, a list of integer
# @return an integer
def findMin(self, num):
if len(num) == 1:
return num[0]
low = 0
high = len(num)-1
while low < high and num[low] >= num[high]:
mid = (low + high) / 2
if num[mid] < num[low]:
high = mid
elif num[mid] > num[high]:
low = mid + 1
else:
low = low + 1
return num[low]