69.旋转数组中的最小元素(数组、算法)。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,
输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,
时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。
package com.algo.ms;
public class MinFromRotateArray67 {
/*
* 69.旋转数组中的最小元素(数组、算法)。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,
输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,
时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。
*/
public int binarySearch(int[] arr, int start, int end){
int mid = start + (end - start + 1)/2;
if(start == end) return arr[start];
if(end - start == 1) {
if (arr[start] < arr[end]) return arr[start];
else return arr[end];
}
if(arr[start] < arr[mid] && arr[mid] > arr[end]){
return binarySearch(arr, mid, end);
}
else if(arr[start] > arr[mid] && arr[mid] < arr[end]){
return binarySearch(arr, start, mid);
}
else if(arr[start] < arr[mid] && arr[mid] < arr[end]){
return binarySearch(arr, start, mid);
}
return arr[start];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1, 2, 3, 4, 5};
MinFromRotateArray67 min = new MinFromRotateArray67();
System.out.println(min.binarySearch(arr, 0, arr.length - 1));
}
}