Leetcode 33.回転ソート配列の検索(Search in Rotated Sorted Array)
Leetcode 33.回転ソート配列の検索
1タイトル記述(Leetcodeタイトルリンク)
は、昇順に並べられた配列が予め未知の点で回転したと仮定する.(例えば配列[0,1,2,4,5,6,7]は[4,5,6,7,0,1,2]になる可能性がある).指定したターゲット値を検索し、配列にターゲット値が存在する場合はインデックスを返します.そうでない場合は-1を返します.配列に重複する要素が存在しないと仮定できます.あなたのアルゴリズムの時間複雑度はO(log n)レベルでなければなりません.
2問題解
本題は153番と似ていますが、153番より判断することが多いです.中点がtargetに等しいかどうかを判断し、等しい場合は直接中点下標に戻る. 果中点が右値より小さい場合、右半分は必ず第2の昇順配列にあり、この場合、targetが中点と右値の間にある場合、二分は右半分を判断し、逆に左半分を判断する. 中点が右値より大きい場合、左半分は必ず第1の昇順配列にあり、この場合、targetが左値と中点の間にある場合、二分は左半分を判断し、逆に右半分を判断する.
1タイトル記述(Leetcodeタイトルリンク)
は、昇順に並べられた配列が予め未知の点で回転したと仮定する.(例えば配列[0,1,2,4,5,6,7]は[4,5,6,7,0,1,2]になる可能性がある).指定したターゲット値を検索し、配列にターゲット値が存在する場合はインデックスを返します.そうでない場合は-1を返します.配列に重複する要素が存在しないと仮定できます.あなたのアルゴリズムの時間複雑度はO(log n)レベルでなければなりません.
: nums = [4,5,6,7,0,1,2], target = 0
: 4
: nums = [4,5,6,7,0,1,2], target = 3
: -1
2問題解
本題は153番と似ていますが、153番より判断することが多いです.
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums:
return -1
length = len(nums)
left, right = 0, length - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
if nums[mid] < nums[right]:
if target > nums[mid] and target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
if target < nums[mid] and target >= nums[left]:
right = mid - 1
else:
left = mid + 1
return -1