问题链接
LeetCode 81. Search in Rotated Sorted Array II
题目解析
给定一个“升序”的数组,从中寻找目标值。“升序”:旋转后的升序,例如 [4,5,1,2,3]。
时间限制:(O(lgN))。
解题思路
本题与上一题LeetCode 33. Search in Rotated Sorted Array几乎一模一样,唯一的改变是可以有 重复 的数据。重复的数据有什么影响呢?
上一题中,我们找到的规律是:如果中间值小于最右值,则右半段绝对升序,若中间值大于最右值,则左半段绝对升序。如果出现了重复数字,影响只有一个——中间值等于最右值。这种情况怎么办呢?直接把最右值去掉即可(即right--)。
除此之外,其他代码与上一题相同。
参考代码
class Solution {
public:
bool search(vector<int>& nums, int target) {
int len = nums.size();
if (len < 1) return false;
int left = 0, right = len-1;
while(left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return true;
if (nums[mid] < nums[right]) {
if (nums[mid] < target && nums[right] >= target) left = mid+1;
else right = mid-1;
}
else if (nums[mid] > nums[right]) {
if (nums[left] <= target && nums[mid] > target) right = mid-1;
else left = mid+1;
}
else right--;
}
return false;
}
};
相似题目
LeetCode 33. Search in Rotated Sorted Array
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.