PHP实现找出有序数组中绝对值最小的数算法分析


Posted in PHP onAugust 07, 2017

本文实例讲述了PHP实现找出有序数组中绝对值最小的数算法。分享给大家供大家参考,具体如下:

问题:

一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值。

方法1:

遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数。

方法2:

二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn)。

分析步骤:

1. 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数

2. 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数

3. 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场:

①. 如果a[mid]<0,因为数组是升序,说明绝对值最小的数不会出现在a[mid]左边,同时判断a[mid+1]元素的正负,如果为负数,那么需要在mid右侧区间进行查找,如果a[mid-1]不为负,那么说明这两个数是数组中正负交界点,返回这两个数的绝对值较小的。

②. 如果a[mid]>0,因为数组是升序,说明绝对值最小的数不会出现在a[mid]右边,同时判断a[mid-1]元素的正负,如果为负数,那么说明这两个数是数组中正负交界点,返回这两个数的绝对值较小的,如果a[mid-1]不为负,那么需要在mid以左的区间进行查找。

③. 如果a[mid] == 0,那么a[mid]即为绝对在最小的元素。

function selectAbsMinNum(array $arr)
{
  $start = 0;
  $len = count($arr) - 1;
  if ($arr[0] > 0) { //正数数组
    return $arr[0];
  }
  if ($arr[$len] < 0) { //负数数组
    return $arr[$len];
  }
  while ($start < $len) {
    $mid = floor(($start + $len) / 2);
    if ($arr[$mid] > 0) {
      if ($arr[$mid - 1] > 0) {
        $len = $mid - 1;
      } else {
        return min($arr[$mid], -$arr[$mid - 1]);
      }
    } elseif ($arr[$mid] < 0) {
      if ($arr[$mid + 1] < 0) {
        $start = $mid + 1;
      } else {
        return min(-$arr[$mid], $arr[$mid + 1]);
      }
    } else {
      return $arr[$mid];
    }
  }
}
$sortArr = [-5, -4, -4, -4, 5, 7, 9];
echo selectAbsMinNum($sortArr), PHP_EOL;

运行结果:4

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP个人网站架设连环讲(四)
Oct 09 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
php 无法载入mysql扩展
Mar 12 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
php图片加水印原理(超简单的实例代码)
Jan 18 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
常用PHP封装分页工具类
Jan 14 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 #PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 #PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 #PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 #PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 #PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 #PHP
php封装的mongodb操作类代码
Aug 06 #PHP
You might like
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
铭立家具面试题
2012/12/06 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
学生自我鉴定
2013/12/18 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
2014年工程师工作总结
2014/11/25 职场文书
股权转让协议范本
2014/12/07 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
gateway网关接口请求的校验方式
2021/07/15 Java/Android
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android