题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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]