您的位置:首页 > 职场人生

微软面试100题-69

2016-05-14 22:52 369 查看

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));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: