使用Java怎么查找旋转数组中的最小数字

  介绍

本文章向大家介绍使用Java怎么查找旋转数组中的最小数字的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java是什么

Java是一门面向对象编程语言,可以编写桌面应用程序,网络应用程序,分布式系统和嵌入式系统应用程序。

代码实现如下:

public  class  Test08  {      public 才能static  int  getTheMin (int  num []), {   ,,,if  (nums ==, null  | |, nums.length ==, 0), {   ,,,,,throw  new  RuntimeException (“input 错误!“);   ,,,}   ,,,int  result =, num [0];   ,,,for  (int 小姐:=,0;,小姐:& lt;, nums.length 作用;1;,我+ +),{   ,,,,,if  (num(小姐:+,- 1),& lt;, num[我]),{   ,,,,,,,result =, num[小姐:+,- 1];   ,,,,,,,休息;   ,,,,,}   ,,,}   ,,,return 结果;   ,,}      public 才能;static  void  main (String [], args), {   ,,,//,典型输入,单调升序的数组的一个旋转   ,,,int [], array1 =, {3,, 4,, 5,, 1,, 2};   ,,,System.out.println (getTheMin (array1));      ,,,//,有重复数字,并且重复的数字刚好的最小的数字   ,,,int [], array2 =, {3,, 4,, 5,, 1,, 1,, 2};   ,,,System.out.println (getTheMin (array2));      ,,,//,有重复数字,但重复的数字不是第一个数字和最后一个数字   ,,,int [], array3 =, {3,, 4,, 5,, 1,, 2,, 2};   ,,,System.out.println (getTheMin (array3));      ,,,//,有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字   ,,,int [], array4 =, {1, 0, 1, 1, 1};   ,,,System.out.println (getTheMin (array4));      ,,,//,单调升序数组,旋转0个元素,也就是单调升序数组本身   ,,,int [], array5 =, {1,, 2,, 3,, 4,, 5};   ,,,System.out.println (getTheMin (array5));      ,,,//,数组中只有一个数字   ,,,int [], array6 =, {2};   ,,,System.out.println (getTheMin (array6));      ,,,//,数组中数字都相同   ,,,int [], array7 =, {1, 1, 1, 1, 1, 1, 1};   ,,,System.out.println (getTheMin (array7));   ,,}   }

打印结果没什么毛病。不过这样的方法显然不是最优的,我们看看有没有办法找出更加优质的方法处理。

有序,还要查找?

找到这两个关键字,我们不免会想到我们的二分查找法,但不少小伙伴肯定会问,我们这个数组旋转后已经不是一个真正的有序数组了,不过倒像是两个递增的数组组合而成的,我们可以这样思考。

我们可以设定两个下标低和高,并设定中期=(低+高)/2,我们自然就可以找到数组中间的元素阵列(中期),如果中间的元素位于前面的递增数组,那么它应该大于或者等下于低标对应的元素,此时数组中最小的元素应该位于该元素的后面,我们可以把低下标指向该中间元素,这样可以缩小查找的范围。

同样,如果中间元素位于后面的递增子数组,那么它应该小于或者等于高下标对应的元素。此时该数组中最小的元素应该位于该中间元素的前面。我们就可以把高下标更新到中位数的下标,这样也可以缩小查找的范围,移动之后的高下标对应的元素仍然在后面的递增子数组中。

不管是更低还新是高,我们的查找范围都会缩小为原来的一半,接下来我们再用更新的下标去重复新一轮的查找。直到最后两个下标相邻,也就是我们的循环结束条件。

说了一堆,似乎已经绕的云里雾里了,我们不妨就拿题干中的这个输入来模拟验证一下我们的算法。

<李>

输入:{3、4、5、1、2}

<李>

此=0时低,高=4=2,中期对应的值分别是:num(低)=3,num(高)=2,num(中期)=5

<李>

由于num(中期)的在num(低),所以num(中期)应该是在左边的递增子数组中。

<李>

更新低==2,中期num(低)=5,中期=(低+高)/2=3,num[中]=1;

<李>

高-低≠1,继续更新

<李>

由于num[中]& lt;num(高),所以断定num(中期)=1位于右边的自增子数组中,

<李>

更新高==3中期,由于高,中期=1,所以结束循环,得到最小值num(高)=1;

我们再来看看Java中如何用代码实现这个思路:

public  class  Test08  {      public 才能static  int  getTheMin (int  num []), {   ,,,if  (nums ==, null  | |, nums.length ==, 0), {   ,,,,,throw  new  RuntimeException (“input 错误!“);   ,,,}   ,,,//,如果只有一个元素,直接返回   ,,,if  (==nums.length  1)   ,,,,,return  num [0];   ,,,int  result =, num [0];   ,,,int  low =, 0,, high =, nums.length 作用;1;   ,,,int 中期;   ,,,//,确保,low 下标对应的值在左边的递增子数组,high 对应的值在右边递增子数组   ,,,while  (num(低),在=,num(高)),{   ,,,,,//,确保循环结束条件   ,,,,,if  (high 安康;low ==, 1), {   ,,,,,,,return  num(高);   ,,,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用Java怎么查找旋转数组中的最小数字