• 【LeetCode每天一题】Search in Rotated Sorted Array II(在旋转数组中查找数字)


      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?

    思路


           这道题在之前剑指offer中做过,两道题是一样的,都是利用二分查找的思想来进行查找,只不过这里的判断条件会复杂一些。因此我们可因此是旋转数组所以相当于会存在有序两个区间。每次进行查找时,我们先判断middle是否是target,不是时再判断nums[start] 与nums[middle]的大小关系。 然后再判断nums[start] ,nums[middle]与target的大小关系。从而可以缩小查找空间。另外因为数组中可能有重复的元素的情况,因此我们最初需要进行特殊判断是否存在,如果存在这种情况,我们只能使用顺序查找来得到结果。特殊的情况例如[0,0,0,0,0,0,-1,0,]。

    图示思路


    解决代码


     1 class Solution(object):
     2     def search(self, nums, target):
     3         """
     4         :type nums: List[int]
     5         :type target: int
     6         :rtype: bool
     7         """
     8         if not nums:       # 空列表直接返回
     9             return False
    10         start, end = 0, len(nums)-1
    11         middle = start +((end - start)>>1)       # 取中间值
    12         if nums[start] == nums[middle] == nums[end]:       # 异常情况
    13             for i in range(end+1):
    14                 if nums[i] == target:
    15                     return True
    16             return False
    17         
    18         while start <= end:           # 二分查找
    19             if nums[middle] == target:
    20                 return True
    21             if nums[start] <= nums[middle]:          # 说明再前半部分的有序序列中
    22                 if nums[start] <= target and nums[middle] > target:     # 根据情况移动指针位置
    23                     end = middle -1
    24                 else:
    25                     start = middle + 1
    26             else:                                  #  否则再后半段的有序部分
    27                 if nums[end] >= target and nums[middle] < target:      
    28                     start = middle +1
    29                 else:
    30                     end = middle - 1
    31             middle = start +((end - start)>>1)       # 重新取中间值
    32         return False
  • 相关阅读:
    当你输入一个网址的时候,实际会发生什么?
    HTTP响应报文与工作原理详解
    DNS系统的解析原理
    spark-streaming集成Kafka处理实时数据
    python分布式环境下的限流器
    使用spark与MySQL进行数据交互的方法
    Linux Redis集群搭建与集群客户端实现
    commons-pool与commons-pool2连接池(Hadoop连接池)
    Kazoo Python Zookeeper 选主
    SpringMVC拦截器Interceptor
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10797074.html
Copyright © 2020-2023  润新知