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你的验证码安全码?
Jan 02 PHP
PHP开发中常用的8个小技巧
Aug 27 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 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 ctype函数中文翻译和示例
2014/03/21 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
Jquery中dialog属性小记
2010/09/03 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
Node.JS文件系统解析实例详解
2017/05/15 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Python如何实现动态数组
2019/11/02 Python
Python安装whl文件过程图解
2020/02/18 Python
python如何保存文本文件
2020/06/07 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
大一自我鉴定范文
2013/10/04 职场文书
村官学习十八大感想
2014/01/15 职场文书
小学英语教学反思
2014/01/30 职场文书
自我鉴定标准格式
2014/03/19 职场文书
社区服务活动总结
2014/05/07 职场文书
安全环保标语
2014/06/09 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书