利用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中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP操作Redis数据库常用方法示例
Aug 25 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
php解析非标准json、非规范json的方式实例
Dec 10 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
set_include_path在win和linux下的区别
2008/01/10 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
公司董事长职责
2013/12/12 职场文书
项目合作协议书
2014/09/23 职场文书
档案管理员岗位职责
2015/02/12 职场文书
javascript对象3个属性特征
2021/11/17 Javascript
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS