把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
简单粗暴的遍历
private static int minNumberInRotateArray(int[] array) {
if (array.length == 0) return 0;
int min = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
}
//时间复杂度是o(n)
既然是旋转数组,可以用二分查找的思路找最小值
/**
*旋转后,数组分为两个排序数组,而且前一个数组中的数均大于等于后一个数组中的数,
* 因为要查找数组中的最小数,也就是第二个数组中的第一个数,可以采用二分查找的思想
*/
private static int minMid(int[] array) {
if (array.length == 0) return 0;
int p1 = 0;//头指针 从前向后遍历
int p2 = array.length-1;//尾指针 从后向前遍历
int min = array[p1];//如果没有发生旋转,直接将array[0]的值返回
int mid = 0;
//array[0]>array[length-1]当数组旋转了
while (array[0]>array[p2]){
//当两个指针相邻时 array[p2]就是目标值
if (p2-p1 == 1){
min = array[p2];
break;
}
mid =(p1 + p2)/2;
//如果中间位置的数既等于p1位置上的数,也等于p2位置上的数
if (array[p1]==array[mid]&& array[p2]==array[mid]){
min = minInarray(array,p1,p2);
}
if (array[p1]<=array[mid]){
p1=mid;
} else if (array[p2]>=array[mid]){
p2 = mid;
}
}
return min;
}
private static int minInarray(int[] array, int p1, int p2) {
int min = array[p1];
for (int i=p1+1;i<=p2;i++){
if (min>array[i]){}{
min = array[i];
}
}
return min;
}