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 相关文章推荐
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
PHP4(windows版本)中的COM函数
Oct 09 PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
PHP类的特性实例分析
Sep 28 PHP
利用PHPExcel实现Excel文件的写入和读取
Apr 26 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 PHP
PHP反射实际应用示例
Apr 03 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 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 chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
Python中的类学习笔记
2014/09/23 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
基于python实现模拟数据结构模型
2020/06/12 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
临床医学专业学生的自我评价分享
2013/11/21 职场文书
办公设备采购方案
2014/03/16 职场文书
投资意向书
2014/07/30 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
店铺转让协议书
2014/12/02 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书