原題
假設(shè)有一個(gè)排序的按未知的旋轉(zhuǎn)軸旋轉(zhuǎn)的數(shù)組(比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2)。給定一個(gè)目標(biāo)值進(jìn)行搜索,如果在數(shù)組中找到目標(biāo)值返回?cái)?shù)組中的索引位置,否則返回-1。
給出[4, 5, 1, 2, 3]和target=1,返回 2
給出[4, 5, 1, 2, 3]和target=0,返回 -1
解題思路
- 沒(méi)有重復(fù)的元素是重要信息,有重復(fù)下面方法不成立
- 排序數(shù)組 => binary search => 每次扔掉一半,找中間的數(shù)
/|
/ |
/ |
______|_____
| /
| /
| /
- 分情況討論Mid落在左上區(qū)間還是右下區(qū)間,然后再分別討論target跟Mid的關(guān)系
if nums[mid] > nums[start]:
# mid 在左上
else:
# mid 在右下
完整代碼
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return -1
start, end = 0, len(nums) - 1
while start + 1 < end:
mid = start + (end - start) / 2
if nums[mid] == target:
return mid
elif nums[mid] > nums[start]:
# 注意此處有兩個(gè)等于號(hào),表明在閉區(qū)間內(nèi)
if target >= nums[start] and target <= nums[mid]:
end = mid
else:
start = mid
else:
# 注意此處有兩個(gè)等于號(hào),表明在閉區(qū)間內(nèi)
if target >= nums[mid] and target <= nums[end]:
start = mid
else:
end = mid
if nums[start] == target:
return start
if nums[end] == target:
return end
return -1