旋转数组的最小数字
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组的最小数字相关的知识,希望对你有一定的参考价值。
题目要求:
分析:
一,暴力解法
对于暴力解法其实也就是一次循环遍历,直到找到最小的那个数,是可以解决问题,但是,显然不符合时间复杂度的要求
二,双指针法
由题目可以知道,其实,旋转数组也有规律,就是两个递增数组拼接在了一起,构成了一个非递减的数组,因此,考虑使用双指针法进行遍历,对于这个题目来说,是可以的,但是,如果, 运气比较差,最小的元素在最后一个位置,也就是旋转程度很深,那么时间复杂度和暴力解法无异,因此不考虑使用
三,二分查找
这一个题目最理想的方式就是二分查找,时间复杂度也不高,具体分析,详见代码
import java.util.ArrayList;
public class Solution
public int minNumberInRotateArray(int [] array)
/*
因为题目中已经说了,数据范围,可以不用进行判空
定义左值为:left = 0
右值为:right = array.length - 1
*/
int left = 0;
int right = array.length - 1;
int mid = 0;
while(left < right)
/*
这是一个重要的判断手段,由于是两个递增数组构成的非递减数组
一旦,最左边的值比最右边的小,说明,此时,已经到达了一个递增的数组当中
此时可以直接返回array[left]
*/
/*
为什么此时的left一定是最小元素的下标?
这个很简单,不是最小的,肯定还在下面循环,left处的元素指定是大于right处的
我们的left也是mid + 1 的形式不断递增,如果一直是在第一个判断语句中
只能说明,最小的元素一定在右边
*/
if(array[left] < array[right])
return array[left];
mid = (left + right) >> 1;
if(array[mid] > array[right])
//mid参与了比较,直接使用下一个,需要改变left
left = mid + 1;
else if(array[mid] < array[right])
//mid未参与比较,right需要改变
right = mid;
else
//相等的情况下,缩小right或者right都可以
left++;
return array[left];
以上是关于旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章