【Leetcode】ソートされた配列を回転问题

回転ソートアレイの問題は、主LeetCodeを見つける回転又は最小の固定値のアレイ、全ての研究に関連する知識の半分を求め、4つの質問の合計を含みます。バイナリ検索関連の話題をやって、それが境界条件と終了条件に特別な注意が必要です。問題を行う過程で、あなたは、いくつかのテストケース、およそ独自の判断を設定することもできます。
ここでは4つの質問に対する回答を示します。

回転したソート配列で33.Search

回転配列、それぞれユニークな外観の配列番号を求めるに固定値を見つけます。インデックスのリターンを探します。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        lo,hi = 0,len(nums)-1
        while lo<=hi:
            mid  = lo+((hi-lo)>>1)
            if nums[mid] == target:
                return mid
            if nums[lo] <= nums[mid]:
                if nums[lo] <= target <= nums[mid]:
                    hi = mid -1
                else:
                    lo = mid + 1
            else:
                if nums[mid] <= target <=nums[hi]:
                    lo = mid + 1
                else:
                    hi = mid - 1
        return -1

回転さソートアレイIIに81.Search

回転アレイを解決する固定値を求める、配列は値を繰り返してもよいです。TrueまたはFalseを返します

class Solution(object):
    def search(self, nums, target):
        if not nums:
            return False
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low+(high-low) // 2
            if target == nums[mid]:
                return True
            if nums[low] < nums[mid]:
                if nums[low] <= target <= nums[mid]:
                    high = mid - 1
                else:
                    low = mid + 1
            elif nums[mid]<nums[low]:
                if nums[mid] <= target <= nums[high]:
                    low = mid + 1
                else:
                    high = mid - 1
            else:
                low+=1
        return False

回転したソート配列で153.Find最小

回転配列、それぞれユニークな外観の配列番号を求める最小値を見つけます。最小値を返します。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        lo,hi = 0,len(nums)-1
        if nums[lo] < nums[hi]:return nums[lo] # 递增
        while hi-lo > 1:
            mid = lo+(hi-lo)//2
            if nums[lo] > nums[mid]:
                hi = mid
            elif nums[hi] < nums[mid]:
                lo = mid
        return nums[hi]

回転さソートアレイIIに154.Find最小

アレイを回転求めて最小値を見つけ、配列は値を繰り返してもよいです。最小値を返します。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if not nums:return
        lo,hi = 0,len(nums)-1
        if nums[lo] < nums[hi]:return nums[lo] # 递增
        minVal = nums[lo]
        while hi-lo>1:
            mid = lo+(hi-lo)//2
            if nums[lo] > nums[mid]:
                hi = mid
            elif nums[hi] < nums[mid]:
                lo = mid
            elif nums[mid] == nums[lo] == nums[hi]:
                for i in range(lo,hi):
                    if nums[i] < minVal:
                        minVal = nums[i]
                        hi = i
                return minVal
        return nums[hi]

おすすめ

転載: www.cnblogs.com/hellojamest/p/11583523.html