力扣刷题Day 72:寻找旋转排序数组中的最小值(153)
1.题目描述
2.思路
方法1(自己想的):原地用分治的方法找到前一个元素比后一个元素大的索引,直接输出。
方法2(对灵茶山艾府佬的二分法做了一点改动):不停二分,判断nums[mid]与nums末尾元素的大小关系,如果nums[mid] < nums[-1],那么分割点separate一定在[left, mid - 1]上,否则分割点separate就在[mid + 1, right]上。
3.代码(Python3)
方法1:
class Solution:def findMin(self, nums: List[int]) -> int:def search_separate(left, right):if left > right: return 0mid = (left + right) // 2if mid == len(nums) - 1: return 0if nums[mid] > nums[mid + 1]: return mid + 1separate = search_separate(left, mid - 1)if separate == 0: separate = search_separate(mid + 1, right)return separatereturn nums[search_separate(0, len(nums) - 1)]
方法2:
class Solution:def findMin(self, nums: List[int]) -> int:left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] < nums[-1]: right = mid - 1elif nums[mid] > nums[-1]: left = mid + 1else: breakreturn nums[left]
4.执行情况
方法1:
方法2:
5.感想
二分解题好丝滑。