配列の最初のいくつかの要素を配列の最後に移動します。これを配列の回転と呼びます。昇順で並べ替えられた配列の回転を入力し、回転された配列の最小要素を出力します。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]のローテーションであり、配列の最小値は1です。
例1:
入力:[3,4,5,1,2]
出力:1
例2:
入力:[2,2,2,0,1]
出力:0
注:この質問はメインステーション154の質問と同じです:https : //leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array- ii /
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
アイデア1:暴力(もう一度スキャン)
当初、思想家は二分法の条件を改善するために二分法のアイデアを使用し、最終的にそれはまだ不可能であることがわかりました。彼は重複する数字がない状況のみを対象とすることができたため、暴力を使用しました。
class Solution:
def minArray(self, numbers: List[int]) -> int:
min_num = numbers[0]
for i in range(1, len(numbers)):
if min_num > numbers[i]:
min_num = numbers[i]
break
return min_num
アイデア2:二分法
上記は二分法では不十分であると述べ、解決策を読んだ後、私は上記の問題が解決できることを発見しました。
l:間隔の左側
r:区間の右側
m:間隔の中点
考えられる状況:
1.左の間隔を大きくすると、最小値は含まれません。この場合、l = m + 1
2.左の間隔が下がる場合、最小値が含まれますこの場合:r = m
3.右側の間隔が増加し、最小値は含まれませんこの場合:r = m
4.正しい間隔が満たされる場合、最小値が含まれますこの場合、l = m + 1
5.上記の条件が満たされない場合、l、r、およびmの対応する値がすべて等しいことを意味し、最小値がどこにあるかを判別することは不可能ですが、それらが等しいため、間隔を狭めて、rまたはlに対応する値を削除できます。これにより、最小値は発生しません。値が欠落しているため、次のことができます:r = r-1。
(ディスカッション領域のソリューションは、適切な間隔を検討することで絞り込まれたようで、彼のコードも後で投稿されます)
class Solution:
def minArray(self, numbers: List[int]) -> int:
# 模拟二分
l = 0
r = len(numbers)-1
while l < r and numbers[l] >= numbers[r]:
m = (l + r) // 2
if numbers[l] < numbers[m]:
l = m + 1
elif numbers[l] > numbers[m]:
r = m
elif numbers[m] < numbers[r]:
r = m
elif numbers[m] > numbers[r]:
l = m + 1
else:
r -= 1
# print(l, r, m)
return numbers[l]
class Solution:
def minArray(self, numbers: [int]) -> int:
i, j = 0, len(numbers) - 1
while i < j:
m = (i + j) // 2
if numbers[m] > numbers[j]: i = m + 1
elif numbers[m] < numbers[j]: j = m
else: j -= 1
return numbers[i]
作者:jyd
链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/mian-shi-ti-11-xuan-zhuan-shu-zu-de-zui-xiao-shu-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。