标签:
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
public class Test { public static void main(String[] args) { int[] array = {3,4,5,1,2}; System.out.println(Test.minNumberInRotateArray(array)); } /** * * @param array * @return */ public static int minNumberInRotateArray(int [] array) { if(array.length == 0) return 0; // 数组长度为0, 返回0 int left = 0; // 开始处理的第一个位置 int right = array.length - 1; // 开始处理的最后一个位置 int mid = left; // 设置初始位置 // 确保left在前面排好序的位置,right在后面排好序的位置 while(array[left] >= array[right]) { // 当处理数据只有两个返回后一个结果 if(right - left == 1) { return array[right]; } // 取中间的位置 mid = (left + right) / 2; // 如果三个数相等,顺序查找最小值 if((array[left] == array[mid]) && (array[left] == array[right]) && (array[mid] == array[right]) ) { return minNum(array, left, right); } else if(array[left] >= array[mid]) { // 中间数据在后半部分,最小值在当前mid前面 right = mid; } else { // 中间数据在前半部分,最小值在当前mid后面 left = mid; } } return array[mid]; } private static int minNum(int[] array, int left, int right) { int min = array[left]; for(int i=left+1; i<=right; i++) { if(array[i] < min) { min = array[i]; } } return min; } }
标签:
原文地址:http://www.cnblogs.com/zywu/p/5766221.html