利用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
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
PHP生成条形图的方法
Dec 10 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php实现微信扫码支付
Mar 26 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
PHP实现简易用户登录系统
Jul 10 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 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上传、管理照片示例
2006/10/09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
javascript 有趣而诡异的数组
2009/04/06 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
python二分法实现实例
2013/11/21 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
wxPython色环电阻计算器
2019/11/18 Python
python图形用户接口实例详解
2019/12/16 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Django admin组件的使用
2020/10/24 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
文员试用期转正自我鉴定
2014/09/14 职场文书
工程承包协议书
2014/10/20 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs