【LeetCode每天一題】Search in Rotated Sorted Array II(在旋轉數組中查找數字)
阿新 • • 發佈:2019-04-30
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(在旋轉數組中查找數字)