旋转数组的最小数字
拟人算法系列文章,以容易理解的方式描述算法,点赞收藏不迷路
class Solution:
def minNumberInRotateArray(self, nums: list[int]) -> int:
if not nums:
return 0
lo, hi = 0, len(nums) - 1
while lo < hi:
mid = (lo + hi) // 2
if nums[mid] > nums[hi]:
lo = mid + 1
elif nums[mid] < nums[hi]:
hi = mid
else:
hi -= 1
return nums[lo]
if __name__ == '__main__':
s = Solution()
nums = [2, 2, 2, 1, 2]
print(s.minNumberInRotateArray(nums))
思路同二分查找,只是判断条件为
- 如果中间大于结尾,说明在右边,mid 不再可能,所以 lo=mid+1
- 如果中间小于结尾,说明在左边,mid 还有可能,所以 hi=mid
- 如果中间等于结尾,hi 左移一位(如测试数据)
最后 lo 的数字就是最小的数字