利用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
Dec 14 PHP
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
php 目录与文件处理-郑阿奇(续)
Jul 04 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php文件上传、下载和删除示例
Aug 28 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
PHP执行系统命令函数实例讲解
Mar 03 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框架之模型与数据库
2017/05/07 PHP
php实现websocket实时消息推送
2018/03/30 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
javascript引用对象的方法代码
2007/08/13 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
js获取所有checkbox的值的简单实例
2016/05/30 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
JS实现纸牌发牌动画
2021/01/19 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
详解python单元测试框架unittest
2018/07/02 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
python列表返回重复数据的下标
2020/02/10 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Python学习笔记之装饰器
2020/08/06 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
简述数据库的设计过程
2015/06/22 面试题
linux面试题参考答案(6)
2014/08/29 面试题
linux面试题参考答案(7)
2014/07/24 面试题
如何使JavaScript休眠或等待
2021/04/27 Javascript
浅析MongoDB之安全认证
2021/06/26 MongoDB