旋转数组中的最小数字

把数组中的最开始的几个元素搬到末尾称为数组的旋转。输入一个递增数组的旋转,输出数组中的最小值。例如{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;
}
posted @ 2017-09-05 10:43  被罚站的树  阅读(101)  评论(0)    收藏  举报