利用PHP计算有多少小于当前数字的数字方法示例


Posted in PHP onAugust 26, 2020

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。

以数组形式返回答案。

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。
对于 nums[3]=2 存在一个比它小的数字:(1)。
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:

输入:nums = [6,5,4,8]
输出:[2,1,0,3]

示例 3:

输入:nums = [7,7,7,7]
输出:[0,0,0,0]

提示:

  • 2 <= nums.length <= 500
  • 0 <= nums[i] <= 100

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number

解题思路 1

枚举数组里的每个数字,遍历数组统计有多少数字比当前数字小即可

代码

class Solution {

 /** * @param Integer[] $nums * @return Integer[] */
 function smallerNumbersThanCurrent($nums) {
  $count = count($nums);
  $result = array_fill(0, $count, 0);
  for ($i = 0; $i < $count; $i++) {
   for ($j = 0; $j < $count; $j++) {
    if ($nums[$j] < $nums[$i]) {
     $result[$i]++;
    }
   }
  }

  return $result;
 }
}

解题思路 2 - 频次数组+前缀和

注意到数字的值域范围为 [0,100][0,100] ,所以可以考虑建立一个频次数组 cnt[i]cnt[i] ,表示数字 ii 出现的次数,那么对于数字 ii 而言,它的答案:即小于它的数字出现个数之和,直接算需要遍历 [0,i-1][0,i−1] 的 cntcnt 求和,仍需要线性的时间去计算,但我们注意到这个答案是一个前缀和,所以我们可以再对 cntcnt 数组求前缀和。那么对于数字 ii 的答案就是 cnt[i-1]cnt[i−1] ,算答案的时间复杂度从 O(n)O(n) 降到了 O(1)O(1) 。

最后整个算法流程为:遍历数组元素,更新 cntcnt 数组,即 cnt[nums[i]]+=1 ,然后对 cntcnt 数组求前缀和,最后遍历数组元素,对于相应的数字 O(1)O(1) 得到答案即可。

计数排序是一种特殊的桶排序,一般适用于排序数据长度n远大于种类k的情况。比如本题k=101,n=500,甚至5000。

代码

class Solution {

 /** * @param Integer[] $nums * @return Integer[] */
 function smallerNumbersThanCurrent($nums) {
  $count = count($nums);
  $cnt = array_fill(0, 101, 0); // 填充 0 的计数数组
  $result = array_fill(0, $count, 0); // 填充 0 的结果数组

  // $nums 中出现的值和数量对应落到 $cnt 中
  foreach ($nums as $num) {
   $cnt[$num]++;
  }

  // $cnt 转化成 $i 的值是 sum($cnt[0], .. $cnt[$i - 1]) 新数组,即为小于 $i 的数据数量
  foreach (range(1, 100) as $i) {
   $cnt[$i] += $cnt[$i - 1];
  }

  // 结果数组中出现的 索引值 替换为 计数数组中的 数量
  foreach (range(0, $count - 1) as $i) {
   if ($nums[$i]) {
    $result[$i] = $cnt[$nums[$i] - 1];
   }
  }

  return $result;
 }
}

参考链接

leetcode 官方题解

总结

到此这篇关于利用PHP计算有多少小于当前数字的数字的文章就介绍到这了,更多相关PHP计算小于当前数字内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP安全编程之加密功能
Oct 09 PHP
实用函数9
Nov 08 PHP
支持中文的php加密解密类代码
Nov 27 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 #PHP
PHP执行普通shell命令流程解析
Aug 24 #PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 #PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 #PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 #PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
Aug 20 #PHP
Laravel相关的一些故障解决
Aug 19 #PHP
You might like
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
js实现录音上传功能
2019/11/22 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
python字符串string的内置方法实例详解
2018/05/14 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
python实现canny边缘检测
2020/09/14 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
地下停车场租赁协议范本
2014/10/07 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
表扬信范文
2015/05/04 职场文书
烈士陵园观后感
2015/06/08 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书