一、题目描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
二、输入描述
3,4,5,1,2
三、输出描述
1
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String[] arr=sc.nextLine().split(",");
int[] nums = Arrays.asList(arr).stream().mapToInt(Integer::parseInt).toArray();
System.out.println(minNumberInRotateArray(nums));
}
}
public static 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];
}
五、效果展示
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。