diff --git a/arai60/find-minimum-in-rotated-sorted-array/step1.py b/arai60/find-minimum-in-rotated-sorted-array/step1.py new file mode 100644 index 0000000..0d80c70 --- /dev/null +++ b/arai60/find-minimum-in-rotated-sorted-array/step1.py @@ -0,0 +1,19 @@ +""" +5m30s +前やったのとほぼ同じ +""" + +class Solution: + def findMin(self, nums: List[int]) -> int: + if nums == sorted(nums): + return nums[0] + + left = 0 + right = len(nums) - 1 + while right - left > 1: + mid = (left + right) // 2 + if nums[left] <= nums[mid]: + left = mid + else: + right = mid + return nums[right] diff --git a/arai60/find-minimum-in-rotated-sorted-array/step2.py b/arai60/find-minimum-in-rotated-sorted-array/step2.py new file mode 100644 index 0000000..60a9c63 --- /dev/null +++ b/arai60/find-minimum-in-rotated-sorted-array/step2.py @@ -0,0 +1,46 @@ +""" +わざわざソートしなくても比較するだけでよい +""" + +class Solution: + def findMin(self, nums: List[int]) -> int: + if nums[0] <= nums[-1]: + return nums[0] + + left = 0 + right = len(nums) - 1 + while right - left > 1: + mid = (left + right) // 2 + if nums[left] <= nums[mid]: + left = mid + else: + right = mid + return nums[right] + +# 固定値と比較して寄せていくパターン +# これならソートされていても動く +class Solution: + def findMin(self, nums: List[int]) -> int: + left = -1 + right = len(nums) - 1 + while right - left > 1: + mid = (left + right) // 2 + if nums[mid] >= nums[-1]: + left = mid + else: + right = mid + return nums[right] + +# leftをmidより動かすパターン +# 最小値を直接あてに行く +class Solution: + def findMin(self, nums: List[int]) -> int: + left = 0 + right = len(nums) - 1 + while left < right: + mid = (left + right) // 2 + if nums[mid] <= nums[-1]: + right = mid + else: + left = mid + 1 + return nums[left]