利用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 相关文章推荐
BBS(php &amp; mysql)完整版(四)
Oct 09 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
php解决约瑟夫环示例
Apr 09 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
浅析PHP中的闭包和匿名函数
Dec 25 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 error_log 函数的使用
2009/04/13 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
图片onload事件触发问题解决方法
2011/07/31 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
详解vue 组件的实现原理
2020/11/12 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python数组过滤实现方法
2015/07/27 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Python中一般处理中文的几种方法
2019/03/06 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
Django REST 异常处理详解
2020/07/15 Python
Python如何将模块打包并发布
2020/08/30 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
好军嫂事迹材料
2014/01/15 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
迎新生欢迎词
2015/01/23 职场文书
起诉书格式范文
2015/05/20 职场文书
数学备课组工作总结
2015/08/12 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
聊聊redis-dump工具安装问题
2022/01/18 Redis