Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
第33题的延伸题。
33题说的是给定一个数组,这个数组可能从某个位置分成两部分,这两部分都是排序好的,假设没有重复的数字,给定一个数,然后求出那么数的位置,不存在则返回-1;
这道题说的就是假设可以重复。
当然不能直接循环一次,那样就没有意义了。
如果没有重复的数字,就修改一下二分法就行了,其实也就是几种情况,分类讨论一下就好。
在这里有重复的数字,那么就是,如果遇到pos和left处的数字一样,或者说pos和right处的数字一样,那么移动一个数字。
public class Solution { public boolean search(int[] nums, int target) { int len = nums.length; int left = 0,right = len-1; int pos; while( left <= right ){ pos = (left+right)/2; if( target == nums[pos]) return true; else if( nums[pos] > nums[left] ){ if( target >= nums[left] && target < nums[pos]) right = pos-1; else left = pos+1; }else if( nums[pos] < nums[right] ){ if( target <= nums[right] && target > nums[pos]) left = pos+1; else right = pos-1; }else if( nums[pos] == nums[left] ){ left++; }else if( nums[pos] == nums[right] ) right--; } return false; } }