本文参考书籍 《剑指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_程序员算法面试题之旋转数组的最小值相关推荐

  1. js数组查找最接近_在JavaScript数组中找到最小元素的位置

    在JavaScript数组中找到最小元素的位置 注*  之前有篇文章介绍过数据遍历的性能比较: for in 比for loop慢至少20倍 ,这是另外一篇比较数组查找性能的例子,通过对手工/inde ...

  2. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  3. Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值

    7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...

  4. 找出二维数组中的最小元素

    描述 找出m×n的二维数组中的最小元素,把该元素所在行的各个元素(假设只有一个最小元素)与二维数组的末行元素互换. 输入 第一行包含2个正整数m和n,分别表示二维数组的行数和列数,其中m和n均不超过3 ...

  5. 输出一个为递增排序数组的旋转数组中的最小元素——8

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转, ...

  6. c语言在数组中找最小数,C语言 查找数组中最大最小元素

    //findMax.c /** 查找数组中最大,最小的元素. */ #include #include #include void main() { int array[10];// int Y=10 ...

  7. 在升序排序的数组中插入一个元素 用函数编程实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。 提示:插入(Insertion)是数组的基本操作之一。插入法排序算法

    我先使用了三个函数参数,参数分别为数组a[],数组元素数量number和需要插入的数字n.函数定义为int f(int a[],int number,int n); #include <stdi ...

  8. jquery删除数组中的某个元素下标越界_Java数据结构和算法(二)—数组

    目录 1.Java数组介绍 2.用类封装数组实现数据结构 3.分析数组的局限性 上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻 ...

  9. Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

    ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素  Java 实例 以下实例 ...

最新文章

  1. 单片机编程简单吗?arduino为什么不适合大学生?
  2. windows+php+mysql+apache(wamp)安装配置问题
  3. Understanding Clouds from Satellite Images比赛的discussion调研与colab数据集下载配置
  4. 冷热水龙头_冷热水龙头结构图是怎么样的
  5. 基础知识—循环语句-循环控制
  6. 100m光纤测速多少正常_光纤收发器的分类知识详解
  7. 9.Springcloud的Hystrix服务熔断和服务降级
  8. VBA中对内存地址的操作
  9. 20201008:力扣209周周赛题解(下)
  10. Linux 配置rdate时间服务器方法
  11. android不是16位,16位图像和Android处理
  12. php 到处excel 乱码,php 导出excel乱码怎么办
  13. java如何准确的读取多音字
  14. 真好玩python教孩子学编程_Python真好玩:教孩子学编程
  15. Black Hat USA 2011: Alexander Polyakov - CTO - ERPScan
  16. 经验:作为IT人,如何靠副业赚到第一桶金!
  17. 解决:VMWare虚拟机无法开启,显示模块“Disk”启动失败
  18. 按出生年月日对身份证号进行排序
  19. 安装scrapy报错failed with error code 1 in C:\Users\ADMINI~1\AppData\Local\Temp\pip-install-dvrc8k5o\Twis
  20. 什么是package-info.java

热门文章

  1. 关于数据可视化的方法和工具介绍
  2. 如何架设自己的 SAP UI5 资源服务器
  3. 2021-10-28 SAP Spartacus SSR 性能方面的一些学习笔记
  4. 关于 SAP Spartacus 注入服务 UserAccountService 和 facade 的问题
  5. SAP Spartacus 当购物车里添加的商品个数过多后引起的性能问题以及解决方案
  6. 网友提问:关于CX_VSI_SYSTEM_ERROR异常,Fiori病毒扫描参数文件
  7. SAP Spartacus internationalization(i18n) 的实现 - 关于多语言,翻译支持的实现
  8. 利用Java流进行类的整型字段求和的例子
  9. SAP Analytics Cloud里如何基于一个已有的model创建Story
  10. how is our class instance registered - thanks to AnnotationConfigWebApplicationC