1. 程式人生 > >【LeetCode每天一題】Search in Rotated Sorted Array II(在旋轉數組中查找數字)

【LeetCode每天一題】Search in Rotated Sorted Array II(在旋轉數組中查找數字)

run 裏的 mar 之前 判斷 this 技術分享 href order

  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

【LeetCode每天一題】Search in Rotated Sorted Array II(在旋轉數組中查找數字)