题目描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
题解:
方法一:
最原始的方法,遍历数组,找出最小值
方法二:
二分法,因为旋转的两部分都是有序的,且都是非降序的
代码实现:
方法一、
public static int minNumberInRotateArray(int[] arr) {
int len = arr.length;
if (len == 0) {
return 0;
}
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = (left + right) >> 1; // 中间的索引
if(arr[mid]<arr[right]){
right = mid; // 说明最小值在左半部分
}else if(arr[mid]>arr[right]){
left = mid+1; // 说明最小值在右半部分
}else{
right--; // 如果相等,则缩小查找范围
}
}
return arr[left];
}
方法二、
public static int minNumberInRotateArray(int[] arr) {
int len = arr.length;
if (len == 0) {
return 0;
}
int min = arr[0];
for(int i =0;i<len;i++){
if(arr[i]<min){
min = arr[i];
}
}
return min;
}
总结:
1、分而治之的思想,以及考虑边界情况,如这道题中如果中间值与右边的值相等,那么应该怎么办?