如何用PHP编写查询小于指定数字的所有数字的长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1363个文字,预计阅读时间需要6分钟。
要计算数组中每个元素nums[i]比它小的所有数字的数量,我们可以使用一种有效的方法,即使用桶排序思想。以下是具体步骤:
1. 找到数组中的最大值maxNum,这将决定我们需要的桶的数量。
2.创建一个长度为maxNum+1的桶数组,用于计数每个数字出现的次数。
3.遍历原始数组,将每个数字放入对应的桶中,并增加该桶的计数。
4.从桶数组的最后一个桶开始向前遍历,计算每个桶中所有数字的累加计数。
5.对于原始数组中的每个元素nums[i],使用累加计数得到比它小的数字的总数。
下面是Python代码实现:
python
def countSmaller(nums): if not nums: return []maxNum=max(nums) bucket=[0] * (maxNum + 1) result=[0] * len(nums)
# 填充桶并计算每个桶的累加计数 for num in nums: bucket[num] +=1 for i in range(num + 1, maxNum + 1): bucket[i] +=bucket[i - 1]
# 将累加计数赋值给结果数组 for i in range(len(nums) - 1, -1, -1): result[i]=bucket[nums[i]]
return result
这个方法的时间复杂度是O(n + k),其中n是数组长度,k是数组中最大元素的值。这是因为我们需要遍历整个数组来填充桶,然后再次遍历桶来计算累加计数。这种方法的空间复杂度是O(k),即桶数组的大小。
给你一个数组nums,对于其中每个元素nums[i],请你统计数组中比它小的所有数字的数目,这时你该如何去做?今天小编就来介绍一下计算有多少数字小于当前数字的方法,有需要的可以参考一下。给你一个数组 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
解题思路 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; }}
推荐学习:php视频教程
以上就是php如何计算多少数字小于当前数字的详细内容,更多请关注自由互联其它相关文章!
本文共计1363个文字,预计阅读时间需要6分钟。
要计算数组中每个元素nums[i]比它小的所有数字的数量,我们可以使用一种有效的方法,即使用桶排序思想。以下是具体步骤:
1. 找到数组中的最大值maxNum,这将决定我们需要的桶的数量。
2.创建一个长度为maxNum+1的桶数组,用于计数每个数字出现的次数。
3.遍历原始数组,将每个数字放入对应的桶中,并增加该桶的计数。
4.从桶数组的最后一个桶开始向前遍历,计算每个桶中所有数字的累加计数。
5.对于原始数组中的每个元素nums[i],使用累加计数得到比它小的数字的总数。
下面是Python代码实现:
python
def countSmaller(nums): if not nums: return []maxNum=max(nums) bucket=[0] * (maxNum + 1) result=[0] * len(nums)
# 填充桶并计算每个桶的累加计数 for num in nums: bucket[num] +=1 for i in range(num + 1, maxNum + 1): bucket[i] +=bucket[i - 1]
# 将累加计数赋值给结果数组 for i in range(len(nums) - 1, -1, -1): result[i]=bucket[nums[i]]
return result
这个方法的时间复杂度是O(n + k),其中n是数组长度,k是数组中最大元素的值。这是因为我们需要遍历整个数组来填充桶,然后再次遍历桶来计算累加计数。这种方法的空间复杂度是O(k),即桶数组的大小。
给你一个数组nums,对于其中每个元素nums[i],请你统计数组中比它小的所有数字的数目,这时你该如何去做?今天小编就来介绍一下计算有多少数字小于当前数字的方法,有需要的可以参考一下。给你一个数组 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
解题思路 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; }}
推荐学习:php视频教程
以上就是php如何计算多少数字小于当前数字的详细内容,更多请关注自由互联其它相关文章!

