题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
方法1:3个条件:数组空,返回0; 数组本身有序,返回第一个元素; 否则最小的元素位于数组中,遍历找最小值
方法2:二分查找变体,采用左闭右开的写法,维持左端最小值
C/C++ 运行时间:25ms 占用内存:612k
方法1:
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int key = rotateArray.size(), ans = 0; if(key==0) return 0; //若数组为空 直接返回0 else { if(rotateArray[0]<rotateArray[key-1])//若数组原本就由大到小排序,则返回第一个元素 return rotateArray[0]; else //否则,最小的元素的值在数组内部 { for(int i=1; i<key; ++i) { if(rotateArray[i]<rotateArray[i-1]) { ans = rotateArray[i]; break; } } return ans; } } } };
方法2: 运行时间:28ms 占用内存:608k
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int key = rotateArray.size(); if(key==0) return 0; //若数组为空 直接返回0 else { if(rotateArray[0]<rotateArray[key-1])//若数组原本就由大到小排序,则返回第一个元素 return rotateArray[0]; else //二分 { int left = 0, right = key-1, mid; while(left<right) { mid = (left+right)/2; if(rotateArray[mid]>rotateArray[right]) left = mid+1; else right = mid; } return rotateArray[left]; } } } };
Java 运行时间:254ms 占用内存:27816k
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { int length = array.length, ans = 0; if(length == 0) { return 0; } else { if(array[0]<array[length-1]) return array[0]; else { for(int i=1; i<length; ++i) { if(array[i]<array[i-1]) { ans = array[i]; break; } } return ans; } } } }
Python 2.x 运行时间:999ms 占用内存:5724k
方法1:
# -*- coding:utf-8 -*- class Solution: def minNumberInRotateArray(self, rotateArray): # write code here length, ans = len(rotateArray), 0 if length==0: return 0 else: if rotateArray[0]<rotateArray[length-1]: return rotateArray[0] else: for i in range(1,length): if rotateArray[i]<rotateArray[i-1]: return rotateArray[i]
方法2:二分查找变体,采用左闭右开的写法,维持l是最小值 运行时间:1314ms 占用内存:5728k
class Solution: def minNumberInRotateArray(self, rotateArray): if not rotateArray: return 0 l, h = 0, len(rotateArray) - 1 while l < h: m = (l + h) // 2 if rotateArray[m] > rotateArray[h]: l = m + 1 else: h = m return rotateArray[l]