「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers
,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]
为 [1,2,3,4,5]
的一次旋转,该数组的最小值为1。
示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [2,2,2,0,1]
输出: 0
题目分析
这道题看起来比较简单,我们同样使用二分法来做这道题,我们找到一个数就是左边的数组的任意一个元素要大于等于右边数组的任意一个元素。我们使用二分法来找到这个点,代码如下
代码实现
class Solution {
public int minArray(int[] numbers) {
int i=0,j=numbers.length-1;
while (i<j) {
int mid = (i+j)/2;
if (numbers[mid]>numbers[j]) {
i= mid+1;
}else if (numbers[mid]<numbers[j]) {
j=mid;
} else {
j--;
}
}
return numbers[i];
}
}
关于二分查找的内容,我在前几篇的文章中已经给大家分析了,这里就不再解释了。
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉二分查找的操作。
小知识
反射是java中常用的知识点,也是面试中经常问到的点,反射就是能够动态获取类和对象的信息,任意一个类都能获取它的所有属性和方法并进行调用。
在这里简单说一下java反射的基本概念,以后对于反射的内容我们再小知识模块中再介绍。
如果有不当之处,欢迎指正。