博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algs4-1.4.18数组的局部最小元素
阅读量:6719 次
发布时间:2019-06-25

本文共 1391 字,大约阅读时间需要 4 分钟。

1.4.18数组的局部最小元素。编写一个程序,给定一个含有N个不同整数的数组,找到一个局部最小元素:满足a[i]<a[i-1],且a[i]<a[i+1]的索引i。程序在最坏情况下所需的比较次数为~2lgN。

答:检查数组的中间值a[N/2]以及和它相邻的元素a[N/2-1]和a[N/2+1]。如果a[N/2]是一个局部最小值则算法终止;否则则在较小的相邻元素的半边中继续查找。
说明:按照上面的提示写出下面的代码不能将这个排列中的局部最小找出来。排列:7  6  9  5  4  3  2  1 中的6找不出来。
public class E1d4d18
{
    public static int min(int[] a)
    {
        int lo=1;
        int hi=a.length-1;
        int mid;
        while(lo<hi)
        {
            mid=(lo+hi)/2;
             if(mid-1>=0 && a[mid-1]<a[mid])
                hi=mid-1;
            else if(mid+1<a.length && a[mid]>a[mid+1])
                lo=mid+1;
            else
                return mid;
        }
        return -1;
    }
   
    public static void main(String[] args)
    {
      int[] a=In.readInts(args[0]);
      StdOut.println(min(a));
    }
}
按照下面版本的代码可以避免上述问题,算法是选从mid-1与mid+1中较小的一边找,找不到时再从mid-1与mid+1中较大的一边找。
public class E1d4d18
{
    public static int min(int[] a)
    {
        int lo=1;
        int hi=a.length-2;
        int mid;
        int localMinIndex=-1;
        //find in rang smaller
      while(lo<=hi && localMinIndex==-1)
        {
            mid=(lo+hi)/2;
            if(a[mid]<a[mid-1] && a[mid]<a[mid+1])
                localMinIndex=mid;
            else if(a[mid-1]<a[mid+1])
                hi=mid-1;
            else if(a[mid-1]>a[mid+1])
                lo=mid+1;
        }
       //
      lo=1;
      hi=a.length-2;
      while(lo<=hi && localMinIndex==-1)
      {
          mid=(lo+hi)/2;
          if(a[mid]<a[mid-1] && a[mid]<a[mid+1])
              localMinIndex=mid;
          else if(a[mid-1]<a[mid+1])
              lo=mid+1;
          else if(a[mid-1]>a[mid+1])
              hi=mid-1;
      }
      return localMinIndex;
    }//end min
    public static void main(String[] args)
    {
      int[] a=In.readInts(args[0]);
      StdOut.println(min(a));
    }
}

转载于:https://www.cnblogs.com/longjin2018/p/9854443.html

你可能感兴趣的文章
Linux下mysql的安装与mysql一机多实例
查看>>
could not open virtual machine
查看>>
wordpress 3.8.1更改上传附件或图片大小限制
查看>>
IIS FTP 出现 530 User cannot log in, home Directory Inaccessible 错误
查看>>
DM6467T开发板领航——串口烧写程序
查看>>
微软谷歌推自有平板 挑战苹果难度大
查看>>
PHP中SQL注入与跨站***的防范
查看>>
Java中的异常处理
查看>>
egret--列表组件(list)
查看>>
mysql总结8----游标的学习
查看>>
java操作cookie的学习
查看>>
用sql语句对access数据库进行多条件查询
查看>>
Eclipse常用设置及快捷键
查看>>
DotNetTextBox V3.0 所见即所得编辑器控件Ver3.3.2 Free(免费版)
查看>>
php操作ini配置文件
查看>>
虚函数的应用以及实现机制
查看>>
我的友情链接
查看>>
每个架构师都应该研究下康威定律
查看>>
(转)五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
查看>>
设计模式-由浅到深的单例模式
查看>>