题目:
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).
You are given a target value to search. If found in the array return true, otherwise return false.
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
Follow up:
This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
Would this affect the run-time complexity? How and why?
解法:
是LeetCode 刷题记录 33.Search in Rotated Sorted Array
的升级版
应用其中的解法1
解法1的核心思想是中间值小于最右的值,则右半段有序,如果大于最右的值,则左半段有序,然后再进行二分查找
但是该解法建立在没有重复的元素,该题中有重复元素,所以会出现中间值与最右的值相等的时候
就会出现来面两种情况,[3 1 1] 和 [1 1 3 1],对于这两种情况中间值等于最右值时,目标值3既可以在左边又可以在右边,那怎么办么,对于这种情况其实处理非常简单,只要把最右值向左一位即可继续循环,也可以最左值向右一位即可继续循环
c++:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int lo = 0;
int hi = nums.size() - 1;
while(lo <= hi){
int mid = lo + (hi - lo) / 2;
if(nums[mid] == target) return true;
if(nums[mid] < nums[hi]){
if(target > nums[mid] && target <= nums[hi]) lo = mid + 1;
else hi = mid -1;
} else if(nums[mid] > nums[hi]){
if(target >= nums[lo] && target < nums[mid]) hi = mid - 1;
else lo = mid + 1;
}else hi--;
}
return false;
}
};
java
class Solution {
public boolean search(int[] nums, int target) {
int lo = 0;
int hi = nums.length - 1;
while(lo <= hi){
int mid = lo + (hi - lo) / 2;
if(nums[mid] == target) return true;
if(nums[mid] < nums[hi]){
if(target > nums[mid] && target <= nums[hi]) lo = mid + 1;
else hi = mid -1;
} else if(nums[mid] > nums[hi]) {
if(target >= nums[lo] && target < nums[mid]) hi = mid - 1;
else lo = mid + 1;
} else {
hi--;
}
}
return false;
}
}
python:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: bool
"""
lo = 0
hi = len(nums) - 1
while lo <= hi:
mid = lo + (hi - lo) / 2
if nums[mid] == target: return True
if nums[mid] < nums[hi]:
if target > nums[mid] and target <= nums[hi]: lo = mid + 1
else: hi = mid -1
elif nums[mid] > nums[hi]:
if target >= nums[lo] and target < nums[mid]: hi = mid - 1
else: lo = mid + 1
else:
hi -= 1
return False