旋转数组中的最小数字
把数组中的最开始的几个元素搬到末尾称为数组的旋转。输入一个递增数组的旋转,输出数组中的最小值。例如{1, 2, 3, 4, 5}的一个旋转为{3, 4, 5, 1, 2},那最小值为1。查找最小的值的方式使用二分法。
代码
public static void main(String[] args) {
int[] arr = {3, 4, 5, 1, 2};
System.out.println(min(arr));
}
static public int min(int[] arr) {
int index1 = 0;
int index2 = arr.length - 1;
int indexMid = 0;
while (arr[index1] >= arr[index2]) {
if (index2 - index1 == 1) {
indexMid = index2;
break;
}
indexMid = (index1 + index2) / 2;
//如果下标index1,index2和indexMid的三个下标指向的数字相等,那么只能用顺序查找的方式
if (arr[index1] == arr[index2] && arr[indexMid] == arr[index1])
return minInOrder(arr, index1, index2);
if (arr[indexMid] >= arr[index1])
index1 = indexMid;
else if (arr[indexMid] <= arr[index2])
index2 = indexMid;
}
return arr[indexMid];
}
static private int minInOrder(int[] arr, int index1, int index2) {
int result = arr[index1];
for (int i = index1 + 1; i <= index2; i++) {
if (result > arr[i])
result = arr[i];
}
return result;
}

浙公网安备 33010602011771号