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的变量总结 新手推荐
Apr 18 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
php实现文件预览功能
May 23 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
python发送HTTP请求的方法小结
2015/07/08 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python检测网络延迟的代码
2018/05/15 Python
Python 修改列表中的元素方法
2018/06/26 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Django实现文件上传和下载功能
2019/10/06 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
八年级数学教学反思
2014/01/31 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
家属答谢词
2015/01/05 职场文书
好人好事新闻稿
2015/07/17 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电