题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
思路
紧扣题目字眼: 非递减数组
- 可以为递增数组 如: [1,2,3,4,5]
- 也可以为非递减重复数组 如: [0,1,0,1,0,1]
对于递增数组 如: [1,2,3,4,5] 旋转后为 [3,4,5,1,2],数组中间必然存在最大值,最大值后存在最小数字,所以找出最大值,就能确定最小值
对于非递减重复数组,只需要遍历数组,找出最小值即可
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
left = 0 # 第一指针 因为输入为旋转数组,开头元素为第一数组元素
right = len(rotateArray) - 1 # 第二指针 末尾元素 为旋转后数组元素
while left <= right:
# 不做此处理时间会超时
if (right - left) == 1: # 左右指针 相距为1时
return rotateArray[right]
mid = (left + right) // 2 # 取中间下标
# 如果出现大量重复(例如:[1,0,1,1,1]),只能顺序查找
if rotateArray[mid] == rotateArray[left] and rotateArray[mid] == rotateArray[right]:
res = rotateArray[left]
for i in range(left + 1, right + 1):
if res > rotateArray[i]:
res = rotateArray[i]
return res
# 中间元素位于前面递增数组时,他会大于/等于第二指针指向元素,此时最小值应该位于中间指针后面,第一指针指向中间元素
if rotateArray[mid] >= rotateArray[left]:
left = mid
# 中间元素位于后面递增数组时,他会小于/等于第二指针指向元素,最小元素位于中间元素前面,第二指针指向中间
elif rotateArray[mid] <= rotateArray[right]:
right = mid
return rotateArray[right]