題目描述
假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個(gè)點(diǎn)上進(jìn)行了旋轉(zhuǎn)。
( 例如蛹找,數(shù)組 [0,0,1,2,2,5,6] 可能變?yōu)?[2,5,6,0,0,1,2] )姨伤。
編寫一個(gè)函數(shù)來判斷給定的目標(biāo)值是否存在于數(shù)組中。若存在返回 true庸疾,否則返回 false乍楚。
示例 1:
輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: true
示例 2:
輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false
進(jìn)階:
這是 搜索旋轉(zhuǎn)排序數(shù)組 的延伸題目,本題中的 nums 可能包含重復(fù)元素届慈。
這會(huì)影響到程序的時(shí)間復(fù)雜度嗎炊豪?會(huì)有怎樣的影響凌箕,為什么拧篮?
思路解析
二分查找加速
若nums[mid] == target,則True
判斷是左邊有序還是右邊有序词渤。
左邊的話,判斷是否在左邊串绩,不在就在右邊
右邊的話缺虐,判斷是否在右邊,不在就在左邊
注意無法判斷是否有序礁凡,那么就left += 1高氮,right-= 1
class Solution:
def search(self, nums: List[int], target: int) -> bool:
left = 0
right = len(nums) - 1
while left <= right:
#print(left, right)
mid = left + (right - left) // 2
# 等于目標(biāo)值
if nums[mid] == target:return True
if nums[mid] == nums[left] == nums[right]:
left += 1
right -= 1
# 在前部分
elif nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return False
AC81