描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤ n ≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:O(1) ,时间复杂度:O(logn)
示例1
- 输入: [3,4,5,1,2]
- 返回值: 1
示例2
- 输入: [3,100,200,3]
- 返回值: 3
解题思路
思路1
常规思路,从头开始遍历,找出最小的返回,过于简单了,不贴代码了
思路二
利用这个数组的性质,可以用二分法进行查找
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
// 特殊情况判断
if (array.length== 0) {
return 0;
}
// 左右指针i j
int i = 0, j = array.length - 1;
// 循环
while (i < j) {
// 找到数组的中点 m
int m = (i + j) / 2;
// m在左排序数组中,旋转点在 [m+1, j] 中
if (array[m] > array[j]) i = m + 1;
// m 在右排序数组中,旋转点在 [i, m]中
else if (array[m] < array[j]) j = m;
// 缩小范围继续判断
else j--;
}
// 返回旋转点
return array[i];
}
}
思路三
直接忽略排序过程,吧排序交给数据结构,应用TreeMap,TreeMap会把键按照一定顺序排序,而且TreeMap不允许重复的键,故可以令数组元素的值,等于TreeMap的键,遍历一遍之后,返回第一个键。
import java.util.*;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//寻找最小值
TreeMap result = new TreeMap();
for(int i=0;i<array.length;i++){
result.put(array[i],i);
}
Object a = result.firstKey();
return (int)a;
}
}