LeetCode OJ 之 Search in Rotated Sorted Array II (有序数组翻转后的查找 - 二)

在允许重复元素的旋转排序数组中查找目标值。若数组为[1, 3, 1, 1, 1],无法直接确定哪半段有序。当A[begin] != A[mid],可按上题思路继续;若A[begin] == A[mid],需遍历后半部分以避免漏掉目标值,影响了时间复杂度。" 122109909,11427414,STM32内部Flash数据读取实践,"['嵌入式开发', 'STM32开发', '内存管理', '驱动程序']
摘要由CSDN通过智能技术生成

题目:

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.

跟着有序数组翻转后的查找 ,如果数组有重复怎么办?

这会影响时间复杂度吗?为什么以及如何影响的?写一个函数判断给定的数target是否在数组中。

思路:

上一题的思路是这样的:“本题依然使用二分法,难点在于如何判断  target  在前半段还是后半段。对于无重复的数组4 5 6 7 0 1 2,如果满足 A[begin] <= A[mid] ,即数组的第一个值小于中间值 4 <7 ,那么可以断定前半段数组有序。如果不满足这个条件,(比如:4 5 0 1 2) 则说明后半段有序。因为把这个数组从中间分开后,一定至少有半个数组是有序的。然后再判断 target 是否在有序的半段中(这个很好判断),如果在,则相当于在有序数组中查找,很简单。如果不在有序的那半段,则一定在另外半段里。然后使用迭代即可把target找出。”

对于本题,由于可以有重复,则不能判断一定有半段是有序的。比如:1 3 1 1 1 。当然,如果满足 A[begin] < A[mid] ,还是说明前半段有序,如果满足 A[begin] > A[mid] 说明后半段有序(也有可能后半段全部相等)。如果满足 A[begin] = A[mid] ,就不好判断了,这时可以让 begin+1,不考虑在前半段还是后半段,而是对所有后面的继续判断(这时候就会影响时间复杂度)。比如(3,1)中查找1的这种。

代码:

class Solution {
public:
    bool search(int A[], int n, int target)
    {
        int begin = 0 ; 
        int end = n - 1;
        while(begin <= end)
        {
            int mid = (begin + end)/2;
            if(A[mid] == target)
            {
                return true;
            }
            else
                if(A[begin] < A[mid])
                {
                    if(A[begin] <= target && target < A[mid])
                    {
                        end = mid - 1;
                    }
                    else
                    {
                        begin = mid + 1;
                    }
                }
                else
                    if(A[begin] > A[mid])
                    {
                        if(A[mid] < target && target <= A[end])
                        {
                            begin = mid + 1;
                        }
                        else
                        {
                            end = mid - 1;
                        }
                    }
                    else
                        begin++;
        }
        return false;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值