利用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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
PHP与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
在PHP中利用wsdl创建标准webservice的实现代码
Dec 07 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
php 流程控制switch的简单实例
Jun 07 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
.htaccess文件保护实例讲解
2011/02/06 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
图片之间的切换
2006/06/26 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python避免死锁方法实例分析
2015/06/04 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
探矿工程师自荐信
2014/01/24 职场文书
班队活动设计方案
2014/01/30 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
社会调查研究计划书
2014/05/01 职场文书
教室布置标语
2014/06/26 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
创新社会管理心得体会
2014/09/12 职场文书
男方婚礼答谢词
2015/01/20 职场文书
政府会议通知范文
2015/04/15 职场文书
python数字转对应中文的方法总结
2021/08/02 Python
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题