这两道题类似于之前的旋转数列search,使用二分法即可,但要注意的是由于数列不是完全有序,所以需要处理形如[2,1]的情况,同时对于第二题,要处理形如[2,1,2,2,2]的情况。
public class Solution {
public int findMin(int[] num) {
if(num==null)
return 0;
int l=0, r=num.length-1;
int m;
int min = num[0];
while(l<r){
m=(l+r)/2;
if(num[l]<num[m]){
min=Math.min(num[l],min);
l=m+1;
}
else if(num[l]>num[m]){
min=Math.min(num[m],min);
r=m-1;
}else{
//only when m==l and l = r-1, using l++ to break the loop.
l++;
}
}
//because the array not in order. for example, [2,1], we need to compare min with num[m+1]
min = Math.min(num[r],min);
return min;
}
}
class Solution1 {
public int findMin(int[] num) {
if(num==null)
return 0;
int l=0, r=num.length-1;
int m;
int min = num[0];
while(l<r){
m=(l+r)/2;
if(num[l]<num[m]){
min=Math.min(num[l],min);
l=m+1;
}
else if(num[l]>num[m]){
min=Math.min(num[m],min);
r=m-1;
}else{
//when m==l and l = r-1, using l++ to break the loop.
//when m!=l, using l++ to find num[l]!=num[m];
min = Math.min(num[m],min);
l++;
if(l<num.length && num[l]<num[l-1])
return num[l];
}
}
//because the array not in order. for example, [2,1], we need to compare min with num[m+1]
min = Math.min(num[r],min);
return min;
}
}