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

相关推荐
生成论实验室13 小时前
自动驾驶:一个自主运动的系统
人工智能·算法·机器学习·语言模型·机器人·自动驾驶·安全架构
sheeta199813 小时前
LeetCode 每日一题笔记 日期:2026.06.16 题目:3612. 字符串特殊符号处理
笔记·算法·leetcode
公考指南针13 小时前
2026常识判断完整备考指南:时政、法律、科技怎么备?粉笔、中公、华图、导氮怎么选?
经验分享·学习
CoderYanger13 小时前
A.每日一题:2095. 删除链表的中间节点
java·数据结构·程序人生·leetcode·链表·面试·职场和发展
青山木13 小时前
Hot 100 --- 矩阵置零
线性代数·算法·leetcode·矩阵·哈希算法
Jasmine_llq13 小时前
《B4264 [GESP202503 四级] 二阶矩阵》
线性代数·算法·矩阵·二维矩阵遍历枚举所有2×2矩阵·交叉乘积等式条件判断·输入输出快读加速·长整型防溢出计数统计
DJ斯特拉13 小时前
Tlias智能学习辅助系统(前端部分)
前端·javascript·学习
星恒随风13 小时前
C++ string 类详解:常用接口、OJ 场景与模拟实现中的深浅拷贝
开发语言·c++·笔记·学习·状态模式
searchforAI13 小时前
2026国产AI笔记工具横评:Get笔记、Ai好记、通义听悟、BiBiGPT各有什么特色?
人工智能·笔记·学习·ai·音视频·知识图谱·知识库
不知名的老吴13 小时前
面经经验分享|算法和数据结构考察
数据结构·经验分享·算法