33.回転ソート配列の検索--python

1222 ワード

問題:昇順に並べ替えられた配列が予め未知の点で回転したと仮定し、ターゲット値を与え、配列にこのターゲット値が存在する場合はインデックスを返し、そうでない場合は-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でタイムアウトします.
 
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