小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法。考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offer上的算法题,以及小编总结的答案。下面是第006道剑指offer算法题:
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。例如,
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解析:
见代码注释
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array[0]<array[array.length-1]) return array[0];//输入数组没有旋转
int low = 0 ; int high = array.length - 1;
//最小的数字在旋转之后的第二部分递增序列中,所以只需要不断逼近第二段递增序列的第一个元素即可
while(low < high){
int mid =(high + low)>>1;
if(array[mid] < array[high]){//[mid,high]属于第二段递增序列。所以的往前寻找第二段递增序列的开头,移动high指针
high = mid;
}else if(array[mid] > array[high]){//mid在第一段递增序列中,high在第二段递增序列中,在mid之后寻找第二段递增序列的开头
low = mid+1;
}else{//相等无法判断mid在那个递增序列中
high--;
}
}
return array[low];
}
//两个都可以过,这种解法有点奇怪,当数组有序的时候,应该是通不过d
public int minNumberInRotateArray2(int [] array) {
int low = 0 ; int high = array.length - 1;
//最小的数字在递减部分,所以只需判断哪一部分递减即可
//另外第一部分不递减,那么第二部分就一定递减,锁以只需要判断一半即可
while(low < high){
int mid =(high + low) >> 1;
if(array[mid] < array[low]){//如果前半段递减的话,最小值在前半段
high = mid;
}else if(array[mid] == array[low]){
low = low + 1;
}else if(array[mid]>array[low]){//这里不好判断,因为low可能是最小值
low = mid;//这里表示后半段递减,所以最小值在前半段
}
}
return array[low];
}
}
其他文章
1. 学习笔记和学习资料汇总:前端 + 后端 + java + 大数据 + python + 100多实战项目 + C++
3. 零基础学爬虫
4. 零基础C++学习总结
欢迎关注个人公众号【菜鸟名企梦】,公众号专注:互联网求职面经、java、python、爬虫、大数据等技术分享:
公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有