第一种旋转数组的题目应该都很常见吧,因为它没有重复的数据,不用考虑相等的情况,就是通过中间值去比较,判断哪一边有序,然后在进行缩小区间,直到找到最小值为止,具体代码如下:
public class t153 {
public int findMin(int[] nums) {
if(nums.length==1) return nums[0];
int l=0,r=nums.length-1;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]<nums[r]){//右边有序,找左边
r=mid; //不加一是包含了两种情况,如3,1,2和1,2,3
}else{//左边有序,找右边
l=mid+1;
}
}
return nums[l];
}
}
如果题目要求,数组里面有重复的数字,就会比较复杂一点,不仅要判断大于和小于两种情况,还要判断等于的情况,但是处理还比较轻松,等于情况就是遇到了重复数字,我们直接将重复数字抛弃就好了,不进行处理,直接将r减一即可,代码如下:
public class t154 {
public int findMin(int[] nums) {
if(nums.length==1) return nums[0];
int l=0,r=nums.length-1;
while(l<r){
int mid=l+(r-l)/2;
if(nums[mid]<nums[r]){//右边有序,找左边
r=mid; //不加一是包含了两种情况,若3,1,2和1,2,3
}else if(nums[mid]>nums[r]){//左边有序,找右边
l=mid+1;
}else {
r-=1;
}
}
return nums[l];
}
}