63 搜索旋转排序数组II
Posted 唐的糖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了63 搜索旋转排序数组II相关的知识,希望对你有一定的参考价值。
原题网址:https://www.lintcode.com/problem/search-in-rotated-sorted-array-ii/description
描述
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
您在真实的面试中是否遇到过这个题?
样例
给出[3,4,4,5,7,0,1,2]和target=4,返回 true
标签
二分法
排序数组
数组
思路:方法与搜索排序数组类似,只是多了一个重复判断,如果 left 处元素与 mid 处元素相同,left++;
left 处元素与 mid 处元素相同不好判断mid的左侧是单调区间还是右侧是,因为有两种情况:left~mid 部分的元素相同,如【9,9,9,9,9,5,6,7,8,9】,这时可以直接跳过这部分去判断 mid+1 ,即 left++;或者类似于【9,5,6,7,8,9,9,9,9,9】。
元素重复会影响时间复杂度,因为重复是无法折半查找,而是以距离1步进,时间复杂度会变大。
AC代码:
class Solution {
public:
/**
* @param A: an integer ratated sorted array and duplicates are allowed
* @param target: An integer
* @return: a boolean
*/
bool search(vector<int> &A, int target) {
// write your code here
if (A.empty())
{
return false;
}
int size=A.size();
int left=0,right=size-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if (A[mid]==target)
{
return true;
}
if (A[mid]>A[left])
{
if (A[left]<=target&&target<A[mid])
{
right=mid-1;
}
else
{
left=mid+1;
}
}
else if (A[mid]<A[left])
if (target>A[mid]&&target<=A[right])
{
left=mid+1;
}
else
{
right=mid-1;
}
}
else//无法判断 mid 左侧还是右侧是单调区间,直接left++;
{
left++;
}
}
return false;
}
};
参考:
https://www.cnblogs.com/libaoquan/p/7116860.html
Mark一个资源:算法总结—二分搜索与旋转排序数组
以上是关于63 搜索旋转排序数组II的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II(中等)