【Offer】[11] 【旋转数组的最小元素】
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路分析
利用二叉查找的思路,由于是旋转数组,可以分成两个排序的子数组,而且最小元素是这两个数组的分界线,设置两个索引指针分别指向首尾元素,判断它们与数组中间元素的大小关系:
- 如果中间元素>=第一个元素则说明要找的最小元素在中间元素的后面,将第一个指针指向中间元素;
- 如果中间元素<=最后一个元素则说明要找的最小元素在中间元素的前面,将第二个指针指向中间元素;
- 这样重复的缩小范围查找,最终第一个指针会指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素,即两个指针会相邻,这是最小元素便为第二个指针所指的元素
特殊情况: 如果中间元素 、第一个指针指向元素 、第二个指针指向元素 都相等,这时就不能用二分查找的思路,可以用顺序查找思路进行查找最小值
Java代码
public class Offer011 {
public static void main(String[] args) {
// int [] arr = {3,4,5,1,2};
int [] arr = {1,0,1,1,1};
int minNumberInRotateArray = minNumberInRotateArray(arr);
System.out.println(minNumberInRotateArray);
}
public static int minNumberInRotateArray(int [] array) {
return Solution1(array);
}
/**
* 利用二分查找的思路,注意:要考虑特殊情况
* @param array
* @return
*/
public static int Solution1(int [] array) {
int index1 = 0;
int index2 = array.length-1;
int indexMid = index1;
while(array[index1]>=array[index2]) {
if(index2-index1==1) {
indexMid= index2;
break;
}
indexMid = (index1+index2) >>1;
if(array[index1] == array[index2] && array[indexMid] == array[index1]) {
//特殊情况:要用顺序查找
return MinInOrder(array, index1, index2);
}
if(array[indexMid]>=array[index1]) {
index1 = indexMid;
}else if(array[indexMid]<=array[index2]) {
index2 = indexMid;
}
}
return array[indexMid];
}
/**
* 在index1和index2之间顺序查找最小值
* @param array 在此数组中进行查找
* @param index1 开始索引位置
* @param index2 结束索引位置
* @return
*/
private static int MinInOrder(int[] array,int index1,int index2) {
int min = array[index1];
for(int i=index1+1;i<=index2;i++) {
if(min > array[i]) {
min = array[i];
}
}
return min;
}
}
代码链接
【Offer】[11] 【旋转数组的最小元素】的更多相关文章
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- [剑指 Offer 11. 旋转数组的最小数字]
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...
- 剑指offer——11旋转数组中最小的数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- 剑指Offer:旋转数组的最小数字【11】
剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...
- 【剑指offer】面试题 11. 旋转数组的最小数字
面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...
- 【剑指Offer】面试题11. 旋转数组的最小数字
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个 ...
- 【剑指 Offer】11.旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...
- 《剑指offer》面试题11. 旋转数组的最小数字
问题描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...
- Go语言实现:【剑指offer】旋转数组的最小数字
该题目来源于牛客网<剑指offer>专题. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3, ...
随机推荐
- Vsftp服务器配置文件详解
vsftp软件是我们常见的FTP服务器搭建软件,所有的配置都是基于vsftpd.conf这个配置文件的.vsftpd.conf里面主要包括安全配置,传输,用户还有权限等相关的选项.现在我们讲解下关于V ...
- 从Maven私服获取依赖
通过Internet直接从Maven公用仓库获取依赖包是默认配置.不过对于中国软件公司来讲,访问这些公用仓库通常较慢,对于一些管理严格的不能直接上网的软件公司来讲,这更加是不可能的.Maven项目可以 ...
- C++学习想法
今天是周一,今天做早操的时候舍友说准备买一本C++基础的书.我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由.所以我在这规划了我这一周的学习进程.首先 ...
- js动态添加<tr><td>
<form id="addNewsFormData" name="addNewsFormData" isCheck="true" ac ...
- 自己动手实现MQTT协议
写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...
- Javascript中,实现类与继承的方法和优缺点分析
Javascript是一种弱类型语言,不存在类的概念,但在js中可以模仿类似于JAVA中的类,实现类与继承 第一种方法:利用Javascript中的原型链 //首先定义一个父类 function An ...
- cmd命令行界面运行python脚本显示的中文不正确
在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...
- 建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期
团队开发时,每天都需要输出一个apk包给其它部门的同事测试验证.打包几乎是每天必须完成的功课.如果用IDE来输出apk,那速度是非常慢的,如果还需要有不同渠道的apk包,那程序猿都要疯了.当然也有用 ...
- HBase 系列(五)——HBase 常用 Shell 命令
一.基本命令 打开 Hbase Shell: # hbase shell 1.1 获取帮助 # 获取帮助 help # 获取命令的详细信息 help 'status' 1.2 查看服务器状态 stat ...
- java表达式
JAVA表达式优先级: (如果表达式复杂可直接括号处理) 资源来自尚学堂java视频