题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路1:简单粗暴直接查找
代码如下:
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0) return 0;
else{
int min = array[0];
for(int i=1;i<array.length;i++){
if(array[i] < min){
min = array[i];
}
}
return min;
}
}
}
思路二:根据数组是非减排序数组旋转得来,可以在遍历的时候优化一下,遍历直到a[i]>a[i+1];此时a[i+1]就是最小值,输出即可。
代码如下:
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0) return 0;
else{
for(int i=1;i<array.length;i++){
if(array[i] > array[i+1]){
return array[i+1];
}
}
return 0;
}
}
}
思路三:二分法,折半查找
public static int minNumberInRotateArray(int[] array) {
int a = 0;
if (array.length == 0)
return a;
int i = array.length / 2;
while (i > 0 && i < array.length) {
if (array[i] > array[array.length - 1] && array[i] <= array[i + 1]) {
i++;
} else if (array[i] < array[0] && array[i] >= array[i - 1]) {/
i--;
} else {
a = array[i] > array[i + 1] ? array[i + 1] : array[i];
break;
}
}
return a;
}