问题

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

思路

这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(n)。但这个思路没有利用输入数组的特性。既然有时间复杂度更小的算法,我们容易想到二分查找,因为它的时间复杂度为O(logn)。这个问题是否可以运用二分查找呢?答案是肯定的。观察一下数组的特性,首先递增(称为递增a),然后突然下降到最小值,然后再递增(称为递增b)。当然还有一种特殊情况,就是数组递增,中间没有下降,即旋转元素个数为0。

一般解法:找到中间下标,如果数组开始值小于中间下标对应的值,则表示中间下标属于第一个第一个递增,另开始下标等于中间下标,相反,如果中间下标对应的值小于结尾值,则表明,中间下标输入第二个递增,另结尾下标等于中间下标。直到开始下标和结尾下标相邻。

特殊情况:旋转个数为0,例如{1,2,3,4,5},则可以通过第一个值小于最后一个值判断,直接输出第一个值。

packageoffer008;importjava.util.Scanner;/*** @Title: Main.java

* @Package: offer008

* @Description 旋转数组的最小数字

*@authorHan

* @date 2016-4-18 上午10:39:35

*@versionV1.0*/

public classMain {public static voidmain(String[] args) {

Scanner scanner= newScanner(System.in);int[] arr = null;int count = 0;while(scanner.hasNext()){//输入数组的大小

count =scanner.nextInt();

arr= new int[count];//输入数组

for(int i = 0; i < count; i++){

arr[i]=scanner.nextInt();

}

System.out.println(min(arr));

}

}/*** @Description 得到旋转数组中的最小值

*@authorHan

*@paramarr

*@returnmin*/

private static int min(int[] arr){//判断数组是否为空,长度是否为0

if(arr == null || arr.length == 0){throw new RuntimeException("Error Input");

}//头下标

int startIndex = 0;//尾下标

int endIndex = arr.length - 1;//中间下标

int middleIndex = 0;//如果数组中的第一个值小于了最后一个值,则表明该数组为一个递增数组,直接输出第一个元素即可

while(arr[startIndex] >=arr[endIndex]){//若该startIndex和endIndex相邻成立则表示endIndex指向的数字为最小值

if(endIndex - startIndex == 1){

startIndex=endIndex;break;

}

middleIndex= (startIndex + endIndex) / 2;//如果三个值相等,类似于1 0 1 1 1 1,则需要需要通过顺序查找出最小值

if(arr[middleIndex] == arr[startIndex] && arr[middleIndex] ==arr[endIndex]){returnminByOrder(arr, startIndex, endIndex);

}//若中间值大于startIndex指向的值,则移动startIndex到中间值

if(arr[middleIndex] >=arr[startIndex]){

startIndex=middleIndex;

}else if(arr[middleIndex] <=arr[endIndex]){

endIndex=middleIndex;

}

}returnarr[startIndex];

}/*** @Description 顺序查找出最小值

*@authorHan

*@paramarr

*@paramstartIndex

*@paramendIndex

*@return

*/

private static int minByOrder(int[] arr, int startIndex, intendIndex) {int min =arr[startIndex];for(int i = startIndex + 1; i <= endIndex; i++){if(arr[i]

min=arr[i];

}

}returnmin;

}

}

结果

java旋转数组最小值_旋转数组的最小值相关推荐

  1. C# 传递数组参数_一维数组_二维数组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 二维数组的传参【01_数组指针_指向数组的指针】

    2021-04-08 二维数组的传参[01_数组指针_指向数组的指针] #include <stdio.h> #include <stdint.h> #include < ...

  3. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

  4. java 存储过程 数组参数_执行数组参数的存储过程

    今天在做移植java项目到云平台的工作,遇到了执行数组参数的存储过程的问题.先介绍一下怎么样执行数组参数的存储过程. //创建descriptor,typeArrayName是数据库中数组变量的名称 ...

  5. java交换数组元素_交换数组中的元素(Java)

    是否有任何Java中的数组预定义的方法与哪个可以 直接交换两个元素? 默认Java API没有任何交换数组元素的函数.但是,您可以使用Collections.swap(list, index1, in ...

  6. java数组游戏_关于数组:扑克游戏:使用Java创建卡片组

    我正在从事创建扑克游戏的项目.尽管说明很清楚,但我在面向对象编程方面遇到了很多麻烦. 所以对于这个项目,我们必须创建四个对象,Card,Deck,Hand和Poker Hand.我已经完成了创建卡片对 ...

  7. java 三维数组 魔方_三维数组的横向/纵向输出

    哈哈,对于三维数组,可以想象成一个魔方(立方体). 这个立方体由每层->每层的每行->每层的每行的每列组成. 要实现三位数组横向/纵向的输出,需要遍历每个元素进行输出. 假设数组arrra ...

  8. java 数组中位数_找到数组总和的中位数

    正确的O(n)解决方案非常复杂,需要大量的文本,代码和技巧来解释和证明 . 更确切地说,令人信服地需要3页,这里可以详细查看http://www.cse.yorku.ca/~andy/pubs/X+Y ...

  9. 如歌将两个数组合并_将数组数据拆分后再合并,作为字典的键,实现多条件数据汇总...

    大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第43讲,将数组数据拆分后合并,作为字典的键,实现多条件的数据汇总.在进入字典的讲解后,我给大家讲各种实际情况中利用字典的解决方案,让大家 ...

最新文章

  1. Android Go初探
  2. switch-case和if-else可互换时
  3. linux内核的中断上下文,Linux操作系统中中断上下文中的互斥
  4. Research on NFT
  5. 计算机供应链结构,面向供应链管理的二维条码设计-计算机系统结构专业毕业论文.docx...
  6. 百度的“框”正在移动
  7. 计算机网络考试卷2014B答案,计算机网络考试卷2014B
  8. Lintcode203 Segment Tree Modify solution 题解
  9. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  10. mysql可视化界面创建表_mysql安装及可视化界面
  11. 【SENCHA TOUCH】datepickerfield将日期改为中文日期或自定义的日期
  12. [LeetCode刷题] 476. 数字的补数--Java实现
  13. 2019-08-27-Seo基础知识
  14. WinCC 7.3 + SQL server(杂)
  15. 无限地图生成的制作,一直跑酷一直爽!
  16. 苹果系统使用svg 动画_为什么要使用SVG图像:如何为SVG设置动画并使其快速闪电化
  17. Vue项目实战:订单确认页面实现
  18. 博客2.0时代——读者的赞赏,才是原创的动力
  19. 迅视财经 探馆长沙智能制造大会
  20. PS高效处理图片总结

热门文章

  1. DataNode 心跳机制源码解读
  2. 邮件发送(邮件服务器+邮件客户端)
  3. Flink MapState实例
  4. 服务器执行到这里就停住不动了Initializing Spring root WebApplicationContext
  5. 新型数据中心建设中的“第三张网”——独立的流量采集网
  6. DataBind教学
  7. 最佳开源电子相册管理程序:Gallery2的使用经验
  8. linux下如何关闭防火墙?如何查看防火墙当前的状态
  9. Exceotion 异常
  10. 小程序onPageScroll上滑显示,下滑隐藏