Python数组算法问题:实现统计每个元素的更小元素个数函数
解决统计数组中比当前元素小的元素数量问题
给定数组nums,需针对每个元素nums[i],统计数组中满足j≠i且nums[j] < nums[i]的有效下标j的数量。示例输入nums = [8,1,2,2,3],对应输出[4,0,1,1,3]。
你当前的代码存在两个核心问题:
- 嵌套循环顺序错误,导致最终生成的列表长度是
n²而非n(n为数组长度); - 试图用
smth实现计数的思路逻辑不通,无法完成累加统计。
方案一:基础实现(直观易懂)
直接对每个元素,统计数组中小于它的元素总数即可——因为j=i时nums[j] < nums[i]不成立,无需额外排除j≠i的情况。
from typing import List class Solution: def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: # 对每个元素num,统计数组中小于num的元素个数 return [sum(1 for x in nums if x < num) for num in nums]
比如针对示例中的num=8,生成器表达式会遍历数组并统计4个小于8的元素,最终返回对应计数。
方案二:优化时间复杂度(适合大数据量)
上述方案时间复杂度为O(n²),如果数组规模较大,可通过排序+二分查找将时间复杂度降至O(n log n):
from typing import List import bisect class Solution: def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]: sorted_nums = sorted(nums) # bisect_left返回num在排序数组中首次出现的索引,该索引值即为小于num的元素个数 return [bisect.bisect_left(sorted_nums, num) for num in nums]
以示例为例,排序后的数组为[1,2,2,3,8],bisect_left(sorted_nums, 2)返回1,正好对应两个2各自的计数结果。
内容的提问来源于stack exchange,提问作者Herzeg
相关产品推荐
相关产品推荐

