剑指offer编程题Java实现——面试题8旋转数组的最小数字
剑指offer面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1
旋转数组的特点:
1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素。
2,最小或者最大元素位于两个子数组的分界
解题思路:在排序数组中,可以使用二分查找法进行查找
利用左右两个指针和中间指针元素大小关系判断中间元素是位于前面的子数组还是后面的子数组,缩小查找范围
需要考虑的特例:
1,排序数组本身仍是该数组的一个旋转
2,如果数组内有重复元素,那么有可能出现左右两指针元素与中间元素相同,无法判断中间元素属于前面子数组还是后面子数组,此时用顺序查找
package Solution; /**
* 剑指offer面试题8:旋转数组的最小数字
* 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序数组的一个旋转,输出旋转数组的最小元素。
* 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1
* 旋转数组的特点:
* 1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素。
* 2,最小或者最大元素位于两个子数组的分界
* 解题思路:在排序数组中,可以使用二分查找法进行查找
* 利用左右两个指针和中间指针元素大小关系判断中间元素是位于前面的子数组还是后面的子数组,缩小查找范围
* 需要考虑的特例:
* 1,排序数组本身仍是该数组的一个旋转
* 2,如果数组内有重复元素,那么有可能出现左右两指针元素与中间元素相同,无法判断中间元素属于前面子数组还是后面子数组,此时用顺序查找
* @author GL
*
*/
public class No8FindMinInRotatedSortedArray { public static void main(String[] args) {
int[] array1={3,4,5,1,2};
System.out.println("升序排序数组的一个旋转数组,无重复数字:"+findMin(array1));
int[] array2={1,2,3,4,5};
System.out.println("升序排序数组:"+findMin(array2));
int[] array3={1};
System.out.println("只包含一个数字的数组:"+findMin(array3));
int[] array4={2,4,2,2,2,2,2};
System.out.println("包含重复元素的数组:"+findMin(array4));
int[] array5=null;
System.out.println("null数组:"+findMin(array5)); } public static int findMin(int[] array){
if(array==null||array.length<=0)
throw new RuntimeException("invalid array");
int indexLow=0;
int indexHigh=array.length-1;
//旋转数组为排序数组本身的特例
int indexMiddle=indexLow;
while(array[indexLow]>=array[indexHigh]){
if(indexHigh-indexLow==1){
indexMiddle=indexHigh;
break;
}
//考虑两侧数字和中间数字相同的特殊情况,采用顺序查找算法查找最小值
indexMiddle=(indexLow+indexHigh)/2;
if(array[indexMiddle]==array[indexLow]&&array[indexHigh]==array[indexLow])
return findMinInOrder(array,indexLow,indexHigh);
if(array[indexMiddle]>=array[indexLow])
indexLow=indexMiddle;
else
indexHigh=indexMiddle;
}
return array[indexMiddle];
}
//顺序查找
private static int findMinInOrder(int[] array,int indexLow,int indexHigh){
int result=array[indexLow];
for(int i=indexLow+1;i<indexHigh;i++){
if(array[i]<result)
result=array[i];
}
return result;
}
}
剑指offer编程题Java实现——面试题8旋转数组的最小数字的更多相关文章
- 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...
- 剑指offer编程题Java实现——面试题10二进制中1的个数
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...
- 剑指offer编程题Java实现——面试题7用两个栈实现队列
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...
- 剑指offer编程题Java实现——面试题6重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- 剑指offer编程题Java实现——面试题11数值的整数次方
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
随机推荐
- Android Jetpack 概述
Android Jetpack Overview Android Jetpack Jetpack is a set of libraries, tools and architectural guid ...
- 在Docker环境下部署Kafka
参考:https://blog.csdn.net/u011537073/article/details/70767064
- 如何配置IIS使其支持APK文件的下载
在管理工具里打开Internet 信息服务(IIS)管理器.然后选择需要配置的网站. 右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型” 在左侧的操作区选择点击“添加”MIME ...
- 预浸料(Prepreg,PreimpregnatedMaterials)
预浸料(Prepreg,PreimpregnatedMaterials),是把基体(Matrix)浸渍在强化纤维(Reinforced Fiber)中制成的预浸片材产品,是复合材料的中间材料.
- React Native在window下的环境搭建(二):创建新项目
React Native创建一个新项目: react-native init TestAndroidApp 提示:你可以使用--version参数(注意是两个杠)创建指定版本的项目.例如react-n ...
- 26.Hibernate-主键和映射.md
目录 1.复合主键映射 [toc] 2.集合映射 2.1Set集合 2.2其他集合 [toc] 3.集合数据的读取 [toc] 4.一对多和多对一映射 4.1概念 4.2配置和开发 4.2.1关键点 ...
- Hibernate 再接触 HQL
Category.java package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistence ...
- # 20175213 2018-2019-2 《Java程序设计》第2周学习总结
## 教材学习内容总结 在第二周的学习过程中,我学习了第二章和第三章的内容.第二章中,我学习了基本数据类型和类型转换运算以及与C语言有着相同和不同的数组.标识符由字母,下划线,美元符号和数字组成,并且 ...
- combox省市县三级联动
/** * Name 获取省份(初始化) */ function showProvince(id1, id2, id3) { var paramData = {}; $.ajax({ url: osp ...
- java学习笔记(四):import语法
Import 语法是给编译器寻找特定类的适当位置的一种方法. 创建一个Employee 类,包括四个实体变量姓名(name),年龄(age),职位(designation)和薪水(salary). p ...