利用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 缓存实现代码及详细注释
May 16 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
如何用PHP来实现一个动态Web服务器
Jul 29 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
php微信开发之音乐回复功能
Jun 14 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
Oct 15 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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 IP转换整形(ip2long)的详解
2013/06/06 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
javascript天然的迭代器
2010/10/29 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
使用Python爬取最好大学网大学排名
2018/02/24 Python
python实现简单遗传算法
2018/03/19 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Python global全局变量函数详解
2018/09/18 Python
Python测试线程应用程序过程解析
2019/12/31 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
一套Delphi的笔试题一
2016/02/14 面试题
检察官就职演讲稿
2014/01/13 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
Python中常见的导入方式总结
2021/05/06 Python