zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10797074.html
Copyright © 2011-2022 走看看