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桌面中心(一) 创建数据库
Mar 11 PHP
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
PHP数组函数知识汇总
May 12 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
php将xml转化对象的实例详解
Nov 17 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
php集成动态口令认证
2016/07/21 PHP
php array_map()函数实例用法
2021/03/03 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
Python中的数学运算操作符使用进阶
2016/06/20 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Python多进程fork()函数详解
2019/02/22 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
浅谈JS的二进制家族
2021/05/09 Javascript