【 每天学习一点算法 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)

相关推荐
蒸蒸yyyyzwd3 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气3 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
lisw054 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
阿卡好可爱5 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
一起学安全技术5 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
路灯上の马陈6 小时前
Java 内部类 学习笔记
笔记·学习
前进的李工6 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
Delightrs6 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
li星野7 小时前
从 DICOM 到声学属性学习记录:HU 值怎么变成密度和声速
学习
自信150413057597 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法