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

https://blog.csdn.net/ljlstart/article/details/49105305

https://www.jianshu.com/p/c9016d2bd003

以上是关于63 搜索旋转排序数组II的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II(中等)

LeetCode 81.搜索旋转排序数组 II

LeetCode81. 搜索旋转排序数组 II

搜索旋转排序数组II

LeetCode 81——搜索旋转排序数组 II

算法刷题-搜索旋转排序数组路径总和 II拆分数字