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 相关文章推荐
搜索引擎技术核心揭密
Oct 09 PHP
UCenter Home二次开发指南
May 28 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
PHP实现执行外部程序的方法详解
Aug 17 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
Use Word to Search for Files
2007/06/15 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
详解Python中第三方库Faker
2020/09/25 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
法律专业学生的自我评价
2014/02/07 职场文书
小小商店教学反思
2014/04/27 职场文书
水电站项目建议书
2014/05/12 职场文书
教师演讲稿大全
2014/05/16 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python