您的位置:首页 > 其它

leedcode做题总结,题目Find Minimum in Rotated Sorted ArrayI/II 153/154

2015-01-08 05:48 567 查看
这两道题类似于之前的旋转有序array的search,使用二分法即可,同时把middle与left的值进行比较来判断minimum的位置。与普通二分法不同的是由于数列不是有序的,所以不一定left大于right,所以要处理类似[2,1]这样的特例。同时对于有重复的来说[2,1,2,2,2]这样的情况使用二分很难处理,这是后就要移动left来找到与middle不同的数,同时,在left移动中,如果值变小了,那么就一定是minimum了。

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 {
//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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: