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下利用curl判断远程文件是否存在的实现代码
Oct 08 PHP
php中的常用魔术方法总结
Aug 02 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php实现singleton()单例模式实例
Nov 06 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
全面解读PHP的人气开发框架Laravel
Oct 15 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
CI框架的安全性分析
May 18 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 PHP
PHP调用接口API封装的例子
Oct 11 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 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 DataGrid 实现代码
2009/08/12 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
Python制作爬虫抓取美女图
2016/01/20 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
python验证码识别实例代码
2018/02/03 Python
python3.x上post发送json数据
2018/03/04 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python3标准库总结
2019/02/19 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
农村婚礼主持词
2014/03/13 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
会计主管竞聘书
2015/09/15 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server