首页 > 基础资料 博客日记
剑指offer-6、旋转数组的最小数字
2025-06-26 09:30:01基础资料围观15次
Java资料网推荐剑指offer-6、旋转数组的最小数字这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣
题⽬描述
把⼀个数组最开始的若⼲个元素搬到数组的末尾,我们称之为数组的旋转。
输⼊⼀个⾮递减排序的数组的⼀个旋转,输出旋转数组的最⼩元素。
例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的⼀个旋转,该数组的最⼩值为 1 。
NOTE:给出的所有元素都⼤于 0 ,若数组⼤⼩为 0 ,请返回 0 。
思路及解答
在这⾥最重要的特征是 ⾮递减排序,也就是本来是递增的,如果旋转后会出现什么情况呢?
肯定会出现先递增,再递减的情况,只要我们找出这个点,其实就是最⼩的值。
⼤致有以下两种⽅式解答:
- 直接遍历,当出现后⾯的数⽐前⾯的数⼩的时候,就是找到了最⼩的数。
- 使⽤⼆分查找,在已经排序过的数组中常⽤的算法。
直接遍历
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array == null || array.length == 0){
return 0;
}
if(array.length == 1){
return array[0];
}
int max = array[0];
for(int i=1; i<array.length; i++){
if(array[i]>max){
max = array[i];
}
if(array[i]<max){
return array[i];
}
}
return 0;
}
}
⼆分法
旋转之后的数组其实就是分成两段,⽐如 {3,4,5,1,2} ,可以看到, 3 , 4 , 5 是递增的,但是 5之后1 就是⽐之前的数⼩的,这样就可以找到最⼩值 1 。
取出中间元素,和最右边元素⽐较,如果中间元素⼤于最右边元素,则证明,最⼩值存在于中间元素到最右边元素之间的⼀段。如果中间元素⼩于最右边元素,则证明,最⼩值在最左边元素到中间元素之间的⼀段中。
有⼀种特殊情况,就是相同元素,这样我们没有办法判断最⼩的元素位于哪⼀段,所以只能将右边的边界向左移动,即high-- 。
public class Solution {
public static int minNumberInRotateArray(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
if (array.length == 1) {
return array[0];
}
int low = 0, high = array.length - 1;
while (high - low > 1) {
int mid = (low + high) / 2;
if (array[mid] > array[high]) {
low = mid;
} else if (array[mid] < array[high]) {
high = mid;
} else {
high--;
}
}
return Math.min(array[low], array[high]);
}
}
- 时间复杂度: ⼆分解法,为O(logN)
- 空间复杂度:没有开辟额外的空间,为 O(1)
文章来源:https://www.cnblogs.com/seven97-top/p/18942361
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: