【 每天学习一点算法 2026/05/26】计算右侧小于当前元素的个数

每天学习一点算法 2026/05/26

题目:计算右侧小于当前元素的个数

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: countsi 的值是 numsi 右侧小于 numsi 的元素的数量。

这题思路很简单,就是遍历数组 nums ,计算后续元素小于自身的个数。重点在于如何优化时间复杂度。

假如我们从右侧开始遍历,将已经遍历的元素进行降序排序,那么我们只需要在元素 nums[i] 右侧已排序的元素中找到第一个小于 nums[i] 的元素 nums[j]nums[j] 及它后面的元素就都是小于 nums[i] 的,而且我们找到的位置 j 正是我们进行后续排序插入的 nums[i] 的位置,所以我们可以计算 count[i] 的同时进行排序操作。

由于实在排序数组中寻找元素,所以我们可以利用二分查找进一步进行优化。

typescript 复制代码
function countSmaller(nums: number[]): number[] {
  const len = nums.length
  if (len === 1) return [0] // 长度为 1 直接返回 [0]
  const counts = new Array(len).fill(0) // 结果数组
  const sortList: number[] = [nums[len - 1]] // 已排序部分
  // 从右往左遍历
  for (let i = len - 2; i >= 0; i--) {
    const j =  findSmaller(nums[i]) // 获取当前元素插入位置
    if (j === sortList.length) {
      // 如果插入位置在末尾,表示没有小于它的元素
      sortList.push(nums[i])
      counts[i] = 0
    } else {
      // 插入位置后的元素个数就是小于它的元素个数
      counts[i] = sortList.length - j
      sortList.splice(j, 0, nums[i])
    }
  }
  return counts
  // 辅助函数二分查找第一个小于目标的元素的位置 
  function findSmaller (target: number): number {
    let left = 0, right = sortList.length - 1
    let res = sortList.length
    while (left <= right) {
      const mid = Math.floor((left + right) / 2)
      if (target > sortList[mid]) {
        res = mid
        right = mid - 1
      } else {
        left = mid + 1
      }
    }
    return res
  }
};

我还纳闷这题怎么在树和图的题解里面,看了官方题解提到了树状数组,emmm 有点复杂。待我研究研究,明天写一篇 树状数组 的文章

题目来源:力扣(LeetCode)

相关推荐
还不秃顶的计科生2 小时前
具身智能论文学习8:Octo: An Open-Source Generalist Robot Policy
人工智能·深度学习·学习·机器学习·语言模型·vla·vlm
woshihuanglaoshi3 小时前
事务加持防超卖:ArkTS 在鸿蒙里玩转 TRANSACTION 出入库
学习·华为·harmonyos
qeen873 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
世人万千丶3 小时前
去重插入与超限淘汰:ArkTS 实现鸿蒙搜索历史的 LIMIT 艺术
运维·服务器·学习·华为·harmonyos·鸿蒙
lucas_AI3 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机4 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
2601_949950634 小时前
在线练题更方便,用练题簿打造属于自己的移动题库
学习·考研·刷题·小程序推荐
woshihuanglaoshi5 小时前
十二商品二十流水:鸿蒙进销存种子数据装满预警看板
学习·华为·harmonyos
Nil2085 小时前
leetcode 189轮转数组
数据结构·算法·leetcode