参考 33. Search in Rotated Sorted Array的题解:
http://blog.csdn.net/linwutao0810/article/details/52240194
原想把33的题解改改就行:
1. 33源代码不改的话,对[2,2,2,0,2,2]这种数据会找错最小值;
2. 把33的找最小值算法改一改,改成O(n)遍历的,对[1,3,1,1,1]这种多最小值的数据也不行
3.应对多个最小值再做修改。
最终形成如下解决方法:
public class Solution {
public int binarySearch(int[] nums, int beg, int end, int target){
if (beg == end){
if (nums[beg] == target){
return beg;
}else{
return -1;
}
}else{
int mid = beg + (end - beg) / 2;
if (nums[mid] < target){
beg = mid + 1;
}else{
end = mid;
}
return binarySearch(nums, beg, end, target);
}
}
public boolean search(int[] nums, int target) {
int beg = 0, end = nums.length - 1, mid;
//先寻找最小值的位置;有多个最小值时,要找最左边(循环)的那个最小值
int max = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i ++){
if (nums[i] < max){
max = nums[i];
beg = i;
}
}
if (beg == 0 && nums[beg] == nums[nums.length-1]){
beg = nums.length -1;
}
while(beg > 0 && nums[beg] == nums[beg-1]){
beg --;
}
int result = -1;
//nums_min = nums[beg]
if (beg > 0){
int ret = binarySearch(nums, 0, beg - 1, target);
if (ret != -1)
result = ret;
}
if (result == -1){
result = binarySearch(nums, beg, nums.length - 1, target);
}
return result == -1 ? false : true;
}
}