把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法
-
直接遍历,找到最小值。
-
从前往后找,同时从后往前找
-
二分查找。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if (array.length == 0) {
return 0;
}
if(array.length==1){
return array[0];
}
for (int i = 0; i < array.length; i++) {
if (array[i] > array[i + 1]) {
return array[i + 1];
}
}
return 0;
}
}
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if (array.length == 0) {
return 0;
}
if(array.length==1){
return array[0];
}
for (int i = 0; i < array.length; i++) {
//从前往后找
if (array[i] > array[i + 1]) {
return array[i + 1];
}
//从后往前找
if (array[array.length - 1 - i] < array[array.length - 2 - i]) {
return array[array.length - 1 - i];
}
}
return 0;
}
}
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if (array.length == 0) {
return 0;
}
if(array.length==1){
return array[0];
}
int first = 0;
int last = array.length - 1;
while (first < last) {
int mid = first + (last - first) / 2;
//中间元素大于最后元素,最小值在右区间
if (array[mid] > array[last]) {
first = mid + 1;
//中间元素小于最后元素,最小值在左区间
} else if (array[mid] < array[last]) {
last = mid;
//相等无法确定区间,但是可以把后指针前移
} else {
last--;
}
}
return array[first];
}
}