描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入:
[3,4,5,1,2]
返回值:
1
解题思路
- 可以暴力搜索整个数组
时间复杂度:O(N)
空间复杂度:O(1) - 利用题目有效信息:原数组为非递减数组(有相同元素值数组或者递增数组),即可以理解为一个有序数组,有序数组查找可以考虑二分查找,二分查找的关键是总可以把目标集分割两部分,同时分割出来的情况为原问题的一个子集。因此需要找到二分方法,将数组右边元素作为目标。此时可能出现的情况:
1) array[mid]<array[right]
由于原数组非递减,所以最小值可能是array[mid],将目标值修改为
right=mid
2) array[mid]>array[right]
由于原数组非递减,所以最小值一定位于二分点右边,即
left=mid+1
3)array[mid]=array[right]
此时遇到重复值,无法判断其所在位置,但可以减少搜索范围,即
right=right-1
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array==null||array.length==0){
return 0;
}
int left=0;
int right=array.length-1;
while(left<right){
int mid=left+(right-left)/2;
if(array[mid]<array[right]){
right=mid;
}
else if(array[mid]>array[right]){
left = mid + 1;
}
else{
right = right - 1;
}
}
return array[right];
}
}