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代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
php获取字段名示例分享
Mar 03 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
Windows7下的php环境配置教程
Feb 28 PHP
详解PHP中的PDO类
Jul 06 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
Laravel中的Auth模块详解
Aug 17 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
Laravel开启跨域请求的方法
Oct 13 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
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
php去除HTML标签实例
2013/11/06 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
Python实现新浪博客备份的方法
2016/04/27 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
英语专业毕业生自荐信范文
2013/12/31 职场文书
国窖1573广告词
2014/03/21 职场文书
共产党员公开承诺书
2014/03/25 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
建筑结构施工求职信
2014/07/11 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书