Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become
4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
思路: 二分法, 将元素与中间元素进行对比, 中间元素要么比左边的元素大,要么就比右边的元素小,因此可以分成2种情况进行分析; 每一种情况又分为2种.从左边到中间要么是递增的,要么不是.
时间复杂度: O(logN)
public int search(int[] nums, int target) {
if(nums==null)
return -1;
int len=nums.length;
int mid,left=0,right=len-1;
while(left<=right){
mid=(left+right)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]>=nums[left]){
if(target>=nums[left]&&target<nums[mid])
right=mid-1;
else
left=mid+1;
}
if(nums[mid]<nums[right]){
if(target>nums[mid]&&target<=nums[right])
left=mid+1;
else
right=mid-1;
}
}
return -1;
}
81. Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array":
duplicates are allowed.
举例:
[1,3,1,1]
[1,3,1,1,1]
[1,1,1,3,1]
这种情况,mid和right和left的值都相同时,无法判断target属于哪一边,因此只能将left++,right--.
代码:
public class Solution {
public boolean search(int[] nums, int target) {
if(nums==null)
return false;
int n=nums.length;
int left=0,right=n-1;
int mid;
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]==target)
return true;
if(nums[mid]==nums[left]&&nums[mid]==nums[right]){
left++;
right--;
}
else if(nums[mid]>=nums[left]){
if(nums[mid]>target&&target>=nums[left])
right=mid-1;
else
left=mid+1;
}
else if(nums[mid]<=nums[right]){
if(target>nums[mid]&&target<=nums[right])
left=mid+1;
else
right=mid-1;
}
}
return false;
}
}