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高手?学会“懒惰”的编程
Dec 05 PHP
php基础知识:函数基础知识
Dec 13 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
destoon整合ucenter后注册页面不跳转的解决方法
Jun 21 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
Yii开启片段缓存的方法
Mar 28 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 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引用地址改变变量值的问题
2012/03/23 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
分享10段PHP常用代码
2015/11/11 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
PHP学习记录之数组函数
2018/06/01 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
实体的生命周期
2013/08/31 面试题
上课玩手机检讨书
2014/02/08 职场文书
物业管理专业求职信
2014/06/11 职场文书
超市周年庆活动方案
2014/08/16 职场文书
小城镇建设汇报材料
2014/08/16 职场文书