33.回転ソート配列の検索--python
問題:昇順に並べ替えられた配列が予め未知の点で回転したと仮定し、ターゲット値を与え、配列にこのターゲット値が存在する場合はインデックスを返し、そうでない場合は-1を返し、配列に重複要素が存在しない
法:この問題木には重複要素があるのでnums[mid]がnums[left]にもnums[right]にも等しい場合はありません.配列がある位置で回転すると、配列全体がnums=[4,5,6,7,0,1,2]のような2つの増加した配列に分かれ、前後の配列は単調に増加する.nums[mid]とnums[right]の大きさにより、左右の境界をさらに縮小することができる
考えは簡単ですが、書くには注意しなければならない細部がたくさんあります.
1)大循環条件、while left<=right、等号があることに注意してください.nums=[1]の場合、左右の境界が0に設定されているので、等号を付けなければ大循環も入れないからです.
2)targetと境界nums[right],nums[left]を比較するたびに、等号を付ける
3)コードでtargetとnums[right]を比較した場合、等しくすることはできません.そうしないとnums=[4,5,6,7,0,1,2,3]、target=3でタイムアウトします.
法:この問題木には重複要素があるのでnums[mid]がnums[left]にもnums[right]にも等しい場合はありません.配列がある位置で回転すると、配列全体がnums=[4,5,6,7,0,1,2]のような2つの増加した配列に分かれ、前後の配列は単調に増加する.nums[mid]とnums[right]の大きさにより、左右の境界をさらに縮小することができる
考えは簡単ですが、書くには注意しなければならない細部がたくさんあります.
1)大循環条件、while left<=right、等号があることに注意してください.nums=[1]の場合、左右の境界が0に設定されているので、等号を付けなければ大循環も入れないからです.
2)targetと境界nums[right],nums[left]を比較するたびに、等号を付ける
3)コードでtargetとnums[right]を比較した場合、等しくすることはできません.そうしないとnums=[4,5,6,7,0,1,2,3]、target=3でタイムアウトします.
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
length=len(nums)
if length==0:return -1
left,right=0,length-1
while left<=right:
mid=left+(right-left)//2
if nums[mid]==target:return mid
if nums[mid]=nums[left] and nums[mid] > target:
right=mid
else:left=mid+1
return -1