回転ソートアレイの問題は、主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]