旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值
本文参考书籍 《剑指offer》 作者何海涛
01 题目:数组最小值
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组,输出旋转数组的最小元素。例如数组{3,4,5,1,2}是{1,2,3,4,5}的旋转数组,该数组的最小值为1。
02 解题过程
解法1:最直观的解法,就是遍历数组找到最小元素,这种方式的时间复杂度为o(n)
解法2:递增数组的旋转数组,那么旋转之后的两部分仍然是递增的,如:
我们可以利用二分查找做此题,取start,end为数组开始和结束,使得start和end之间不断逼近,直到找到最小值,mid=(start+end)/2
(1)if arr[mid] >= arr[start] 说明mid值在左边递增数组上,此时 start=mid,让start趋近最小值
(2)if arr[mid] <= arr[end] 说明mid定位在右面的递增数组上,此时 end=mid 向左趋紧最小值
(3) 结束条件:当start==end-1时结束判断 end即为此时的最小值的位置
(4) 判断条件:按照题意 {1,2,3,4,5}也是{1,2,3,4,5}的旋转数组,所以判断条件应该是arr[start] >= arr[end],且初始化mid=start,start=0, end=arr.length-1
03 例外解析
数组 {0,1,1,1,1}的两个旋转数组如下
此数组也是递增数组,但是它的两个旋转数组, 没有办法确定最小值在左面还是在右面,即arr[start]=arr[mid]=arr[end]时没有办法确定数组最小值在哪边。故此时只能循环遍历数组。
04 代码实现
public class RotatedArrayMinValue { /** * 旋转数组的最小数字 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个递增排序的数组,输出旋转数组的最小元素 */ public static int getMinOfRotateArray (int[] arr) { if (arr == null || arr.length == 0) { throw new RuntimeException("数组为空"); } int start = 0; int end = arr.length - 1; int indexMid = start; while (arr[start] >= arr[end]) { if (start == end - 1) { indexMid = end; break; } indexMid = (start + end) / 2; //无法判断是在左半部分还是在有半部分 if (arr[start] == arr[indexMid] && arr[end] == arr[indexMid]) { return getMin(arr, start, end); } if (arr[start] <= arr[indexMid]) { // 说明在前半部分 start = indexMid; }else if (arr[end] >= arr[indexMid]) { // 说明在后半部分 end = indexMid; } } return arr[indexMid]; } public static int getMin(int []arr, int start, int end) { int min = arr[start]; for (int i = start + 1; i <= end; i ++) { if (arr[i] < min) { min = arr[i]; } } return min; } public static void main(String[] args) { int []arr= new int[]{1,2,3,4,5}; System.out.println(getMinOfRotateArray(arr)); int []arr1= new int[]{1,1,0,1,1}; System.out.println(getMinOfRotateArray(arr1)); int []arr2= new int[]{1,0,1,1, 1}; System.out.println(getMinOfRotateArray(arr2)); int []arr3= new int[]{1,1,1,0,1}; System.out.println(getMinOfRotateArray(arr3)); int []arr4= new int[]{6,7,8,1,2,3,4,5,6}; System.out.println(getMinOfRotateArray(arr4)); int []arr5= new int[]{6}; System.out.println(getMinOfRotateArray(arr5)); }}
旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值相关推荐
- js数组查找最接近_在JavaScript数组中找到最小元素的位置
在JavaScript数组中找到最小元素的位置 注* 之前有篇文章介绍过数据遍历的性能比较: for in 比for loop慢至少20倍 ,这是另外一篇比较数组查找性能的例子,通过对手工/inde ...
- Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小
7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...
- Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值
7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...
- 找出二维数组中的最小元素
描述 找出m×n的二维数组中的最小元素,把该元素所在行的各个元素(假设只有一个最小元素)与二维数组的末行元素互换. 输入 第一行包含2个正整数m和n,分别表示二维数组的行数和列数,其中m和n均不超过3 ...
- 输出一个为递增排序数组的旋转数组中的最小元素——8
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转, ...
- c语言在数组中找最小数,C语言 查找数组中最大最小元素
//findMax.c /** 查找数组中最大,最小的元素. */ #include #include #include void main() { int array[10];// int Y=10 ...
- 在升序排序的数组中插入一个元素 用函数编程实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。 提示:插入(Insertion)是数组的基本操作之一。插入法排序算法
我先使用了三个函数参数,参数分别为数组a[],数组元素数量number和需要插入的数字n.函数定义为int f(int a[],int number,int n); #include <stdi ...
- jquery删除数组中的某个元素下标越界_Java数据结构和算法(二)—数组
目录 1.Java数组介绍 2.用类封装数组实现数据结构 3.分析数组的局限性 上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻 ...
- Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un
ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素 Java 实例 以下实例 ...
最新文章
- 单片机编程简单吗?arduino为什么不适合大学生?
- windows+php+mysql+apache(wamp)安装配置问题
- Understanding Clouds from Satellite Images比赛的discussion调研与colab数据集下载配置
- 冷热水龙头_冷热水龙头结构图是怎么样的
- 基础知识—循环语句-循环控制
- 100m光纤测速多少正常_光纤收发器的分类知识详解
- 9.Springcloud的Hystrix服务熔断和服务降级
- VBA中对内存地址的操作
- 20201008:力扣209周周赛题解(下)
- Linux 配置rdate时间服务器方法
- android不是16位,16位图像和Android处理
- php 到处excel 乱码,php 导出excel乱码怎么办
- java如何准确的读取多音字
- 真好玩python教孩子学编程_Python真好玩:教孩子学编程
- Black Hat USA 2011: Alexander Polyakov - CTO - ERPScan
- 经验:作为IT人,如何靠副业赚到第一桶金!
- 解决:VMWare虚拟机无法开启,显示模块“Disk”启动失败
- 按出生年月日对身份证号进行排序
- 安装scrapy报错failed with error code 1 in C:\Users\ADMINI~1\AppData\Local\Temp\pip-install-dvrc8k5o\Twis
- 什么是package-info.java
热门文章
- 关于数据可视化的方法和工具介绍
- 如何架设自己的 SAP UI5 资源服务器
- 2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记
- 关于 SAP Spartacus 注入服务 UserAccountService 和 facade 的问题
- SAP Spartacus 当购物车里添加的商品个数过多后引起的性能问题以及解决方案
- 网友提问:关于CX_VSI_SYSTEM_ERROR异常,Fiori病毒扫描参数文件
- SAP Spartacus internationalization(i18n) 的实现 - 关于多语言,翻译支持的实现
- 利用Java流进行类的整型字段求和的例子
- SAP Analytics Cloud里如何基于一个已有的model创建Story
- how is our class instance registered - thanks to AnnotationConfigWebApplicationC