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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 PHP
PHP中创建和验证哈希的简单方法实探
Jul 06 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
PHP实现的CURL非阻塞调用类
Jul 26 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
PHP针对redis常用操作实例详解
Aug 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读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php字符串分割函数用法实例
2015/03/17 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
Python实现ping指定IP的示例
2018/06/04 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Python3常用内置方法代码实例
2019/11/18 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
会计辞职信范文
2014/01/15 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
大连导游词
2015/02/12 职场文书
实习感想范文
2015/08/10 职场文书
感恩主题班会教案
2015/08/12 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android