利用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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
Smarty中调用FCKeditor的方法
Oct 27 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
php+ajax实现无刷新分页
Nov 18 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
python实现二分查找算法
2017/09/21 Python
python语言元素知识点详解
2019/05/15 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
深入了解Python enumerate和zip
2020/07/16 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
优良学风班总结材料
2014/02/08 职场文书
文明之星事迹材料
2014/05/09 职场文书
触电现场处置方案
2014/05/14 职场文书
化学教育专业自荐信
2014/07/04 职场文书
小学生表扬稿范文
2015/05/05 职场文书
小学六年级毕业感言
2015/07/30 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
python套接字socket通信
2022/04/01 Python