解题思路:
首先用指针修剪一下数组去掉重复的数字,方面后面处理。
然后将数组一分为二,可以得到一半有序的子数组和一半有pivot的子数组。
然后该递归的递归,该二分查找的二分查找。
这道题的另外一种处理方式是在判断哪半边的数组是有序的时候,如果遇到nums[mid]==nums[left]的情况时,就left++,然后继续进行判断。
提交代码:
class Solution {
public boolean search(int[] nums, int target) {
if(nums.length==0) return false;
// shave the nums
int p1=0;
for(int i=1;i<nums.length;i++) {
if(nums[i]==nums[i-1])
continue;
nums[++p1]=nums[i];
}
return findTarget(0, p1, nums, target);
}
public boolean findTarget(int left, int right, int[] nums, int target) {
if (left > right)
return false;
if (nums[left] == target || nums[right] == target)
return true;
int mid = (left + right) / 2;
if (nums[mid] == target)
return true;
// the left is sorted
if (nums[mid] > nums[left]) {
if (nums[left] > target || nums[mid] < target)
return findTarget(mid + 1, right, nums, target);
else { // binary sort
right=mid;
while (left <= right) {
mid = (left + right) / 2;
if (target == nums[mid])
return true;
if (target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
return false;
}
} else { // the right is sorted
if (nums[mid] > target || nums[right] < target)
return findTarget(left, mid-1, nums, target);
else { // binary sort
left=mid;
while (left <= right) {
mid = (left + right) / 2;
if (target == nums[mid])
return true;
if (target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
return false;
}
}
}
}
运行结果: