重複要素を含む回転ソート配列での効率的な検索アルゴリズム
回転されたソート済み配列(重複要素あり)から、指定されたターゲット値を効率的に検索
修正版バイナリサーチ:通常の二分探索を回転配列と重複要素に対応
平均:O(log n) / 最悪:O(n) - 重複要素により線形時間の可能性
left = 0, right = n-1 で検索範囲を設定
mid = (left + right) // 2 で中央のインデックスを計算
nums[mid] == target の場合、True を返す
nums[left] == nums[mid] == nums[right] の場合、両端を縮める
左半分または右半分のどちらがソートされているかを判定
ターゲットの位置に応じて検索範囲を更新
from typing import List
class Solution:
def search(self, nums: List[int], target: int) -> bool:
left: int = 0
right: int = len(nums) - 1
while left <= right:
mid: int = (left + right) // 2
if nums[mid] == target:
return True
# Handle duplicates
while left < mid and nums[left] == nums[mid] and nums[right] == nums[mid]:
left += 1
right -= 1
# Left half is sorted
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
else:
# Right half is sorted
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return False
# Test Examples
solution = Solution()
# Example 1: [2,5,6,0,0,1,2], target = 0
print(solution.search([2,5,6,0,0,1,2], 0)) # True
# Example 2: [2,5,6,0,0,1,2], target = 3
print(solution.search([2,5,6,0,0,1,2], 3)) # False
配列の初期状態です。検索を開始してください。
平均ケース
全要素が重複
定数空間
重複要素が多い場合、どちらの半分がソートされているかを判定できないケースが発生します。 この場合、両端から重複を除去する必要があり、最悪の場合は線形時間O(n)となります。