题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目大意
假如有一个有序数组{1,2,3,4,5},随机从一个位置开始,假如从3开始,得到旋转数组{3,4,5,1,2}。
现在给定一个旋转数组,让你查找数组中的最小值。
解法一、暴力法
直接遍历数组,找到最小值。
解法二、二分法
以{3,4,5,1,2}为例,找到中间坐标的值5,如果5大于数组最右边的2,则可以判断最小值在5后面;
如果是{3,4,0,1,2},找到中间坐标的值0,0小于数组最右边的2,则可以判断最小值是0或者在0前面。
依照此规律不断二分,找到最小值即可。
需要注意一下边界条件。
# -*- coding:utf-8 -*- class Solution: def minNumberInRotateArray(self, rotateArray): if len(rotateArray) == 0: return 0 left = 0 right = len(rotateArray)-1 while rotateArray[left] >= rotateArray[right]: if left == right: break elif right - left == 1: return min(rotateArray[left], rotateArray[right]) mid = (left + right) // 2 if rotateArray[mid] > rotateArray[right]: left = mid+1 else: right = mid return rotateArray[left] # write code here