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中利用XML技术构造远程服务(上)
Oct 09 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
php可变长参数处理函数详解
Feb 22 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
php支付宝系列之电脑网站支付
May 30 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
PHP命名空间简单用法示例
Dec 28 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 归并排序 数组交集
2011/05/10 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
php处理复杂xml数据示例
2016/07/11 PHP
javascript代码加载优化方法
2011/01/30 Javascript
jquery 使用简明教程
2014/03/05 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
React Native 截屏组件的示例代码
2017/12/06 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python 实现选择排序的算法步骤
2018/04/22 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
应聘护士自荐信
2013/10/21 职场文书
学习三严三实心得体会
2014/10/13 职场文书
水电工岗位职责
2015/02/14 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
python字典进行运算原理及实例分享
2021/08/02 Python
Python中如何处理常见报错
2022/01/18 Python