题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如:数组{ 3, 4, 5, 1, 2 }为{ 1, 2, 3, 4, 5 }的一个旋转,该数组的最小值为1。
分析一:
因为数组本来是递增的,所以旋转之后,当出现某一个元素比前一个元素小时,就找到了旋转的位置。
代码一:
package offer.xzs.eleventh;
public class TurnArr01 {
public static void main(String[] args) {
int[] arr = { 7, 2, 3, 3, 4, 5, 6 };
int num = findNum(arr);
System.out.println(num);
}
public static int findNum(int[] array) {
for (int i = 0; i < array.length; i++) {
if (array[i] > array[i + 1]) {
return array[i + 1];
}
}
return 0;
}
}
分析二:
用二分法。
代码二:
package offer.xzs.eleventh;
public class TurnArr02 {
public static void main(String[] args) {
int[] arr = { 7, 8, 2, 3, 3, 4, 5, 6, 7 };
int num = findNum(arr, 0, arr.length - 1);
System.out.println(num);
}
public static int findNum(int[] array, int left, int right) {
if (array.length == 0 || left > right) {
return 0;
}
while (left < right) {
int mid = left + (right - left) / 2;
if (array[left] == array[mid] && array[mid] == array[right]) {
for (int i = left; i < right; i++) {
if (array[i] > array[i + 1]) {
return array[i + 1];
}
}
return array[left];
} else if (array[mid] <= array[right]) {
right = mid;
} else {
left = mid + 1;
}
}
return array[left];
}
}