必刷算法100题之计算右侧小于当前元素的个数

news2025/4/17 4:29:37

 题目链接

315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

题目解析

计算数组里面所有元素右侧比它小的数的个数, 并且组成一个数组,进行返回

算法原理

归并解法(分治)

当前元素的后面, 有多少个比我小(降序)

我们要找到第一比左边小的元素, 这样就可以找到一堆比左边小的元素: right - cur2+1

nums[cur1]对应的位置,里面的ret[原始下标]+=right-cur2+1

我们算出cur1右边有多少个比它小的时候, 就需要把计算出来的个数放进结果数组ret里面

此时我们就需要找到nums数组中当前元素原始下标,然后把数记上 , 此时我们要解决的就是,怎么找到原始的下标, 因为每次归并, nums数组的元素位置会发生改变.

我们使用一个数组的每一个元素来一一对应记录nums每个元素的原始下标

然后在每一次归并排序,排完后,下标也跟着变(绑定移动)

细节问题, 在创建辅助数组进行合并的时候, 需要创建俩个辅助数组, 一个给nums,一个给index,因为俩个数组是同步改变的

代码编写

class Solution {
    int[] ret;//保存计算出来的每个元素右侧更小的数量
    int[] index;//用来保存每个元素对应的原始下标
    int[] tepRet;//用来保存每一段区间排好序的临时数组
    int[] tepIndex;//用来保存每次归并后元素下标的变化

    public void mergeSort(int[] nums, int left, int right) {
        //递归的终点
        if (left >= right) {
            return;
        }
        //计算中间下标
        int mid = (right - left) / 2 + left;
        //递归左边
        mergeSort(nums, left, mid);
        //递归右边
        mergeSort(nums, mid + 1, right);
        int cur1 = left;//左区间起始位置
        int cur2 = mid + 1;//右区间起始位置
        int i = 0;
        //归并(降序)
        while (cur1 <= mid && cur2 <= right) {
            if (nums[cur1] <= nums[cur2]) {
                //局部排序数组元素,把大的放前面
                tepRet[i] = nums[cur2];
                //更新下标
                tepIndex[i++] = index[cur2++];
            } else {
                //升序就说明找到了一堆
                ret[index[cur1]] += right - cur2 + 1;
                tepRet[i] = nums[cur1];
                tepIndex[i++] = index[cur1++];
            }
        }
        //处理剩余元素
        while (cur1 <= mid) {
            tepRet[i] = nums[cur1];
            tepIndex[i++] = index[cur1++];
        }
        while (cur2 <= right) {
            tepRet[i] = nums[cur2];
            tepIndex[i++] = index[cur2++];
        }
        //还原
        for (int j = left; j <= right; j++) {
            nums[j] = tepRet[j - left];
            index[j] = tepIndex[j - left];
        }
    }

    public List<Integer> countSmaller(int[] nums) {
        int n = nums.length;
        ret = new int[n];
        index = new int[n];
        tepRet = new int[n];
        tepIndex = new int[n];
        //记录下原始的下标
        for (int i = 0; i < n; i++) {
            index[i] = i;
        }
        //归并来进行处理
        mergeSort(nums, 0, n - 1);
        ArrayList<Integer> list = new ArrayList<>();
        for (int x : ret) {
            list.add(x);
        }
        return list;

    }
}

注意: 1> 我们在进行递归的时候,不仅要保存当前数组值在排序后的的临时数组, 也要保存下标的临时数组

        2> 多思考为什么此时我们临时数组是直接赋值大小都为n,而不是像之前是一个区间数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python依赖注入完全指南:高效解耦、技术深析与实践落地

Python依赖注入完全指南&#xff1a;高效解耦、技术深析与实践落地 摘要 依赖注入&#xff08;DI&#xff09;不仅是一种设计技术&#xff0c;更是一种解耦的艺术。它通过削减模块间的强耦合性&#xff0c;为系统提供了更高的灵活性和可测试性&#xff0c;特别是在 FastAPI 等…

深度学习ResNet模型提取影响特征

大家好&#xff0c;我是带我去滑雪&#xff01; 影像组学作为近年来医学影像分析领域的重要研究方向&#xff0c;致力于通过从医学图像中高通量提取大量定量特征&#xff0c;以辅助疾病诊断、分型、预后评估及治疗反应预测。这些影像特征涵盖了形状、纹理、灰度统计及波形变换等…

【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;QT 欢迎大家点赞收藏评论&#x1f60a; 目录 Qt Creator 新建项⽬认识 Qt Creator 界⾯项⽬⽂件解析Qt 编程注意事项认识对象模型&#xff08;对象树&#xff09;Qt 窗⼝坐标体系 Qt Creator 新…

制造业项目管理如何做才能更高效?制造企业如何选择适配的数字化项目管理系统工具?

一、制造企业项目管理过程中面临的痛点有哪些&#xff1f; 制造企业在项目管理过程中面临的痛点通常涉及跨部门协作、资源调配、数据整合、风险控制等多个维度&#xff0c;且与行业特性&#xff08;如离散制造vs流程制造&#xff09;紧密相关。 进度失控多项目资源冲突信息孤…

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …

七种驱动器综合对比——《器件手册--驱动器》

九、驱动器 名称 功能与作用 工作原理 优势 应用 隔离式栅极驱动器 隔离式栅极驱动器用于控制功率晶体管&#xff08;如MOSFET、IGBT、SiC或GaN等&#xff09;的开关&#xff0c;其核心功能是将控制信号从低压侧传输到高压侧的功率器件栅极&#xff0c;同时在输入和输出之…

redis系列--1.redis是什么

国际惯例&#xff0c;想了解一个东西&#xff0c;首先就要看看官方提供了什么。redis的官网是https://redis.io 。以下这段话就是redis的简介了&#xff1a; Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message…

CSS 过渡与变形:让交互更丝滑

在网页设计中&#xff0c;动效能让用户交互更自然、流畅&#xff0c;提升使用体验。本文将通过 CSS 的 transition&#xff08;过渡&#xff09;和 transform&#xff08;变形&#xff09;属性&#xff0c;带你入门基础动效设计&#xff0c;结合案例演示如何实现颜色渐变、元素…

MecAgent Copilot:机械设计师的AI助手,开启“氛围建模”新时代

MecAgent Copilot作为机械设计师的AI助手,正通过多项核心技术推动机械设计进入“氛围建模”新时代。以下从功能特性、技术支撑和应用场景三方面解析其创新价值: 一、核心功能特性 ​​智能草图生成与参数化建模​​ 支持自然语言输入生成设计草图和3D模型,如输入“剖面透视…

【prometheus+Grafana篇】Prometheus与Grafana:深入了解监控架构与数据可视化分析平台

&#x1f4ab;《博主主页》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果觉得文章对你有所帮…

【后端开发】初识Spring IoC与SpringDI、图书管理系统

文章目录 图书管理系统用户登录需求分析接口定义前端页面代码服务器代码 图书列表展示需求分析接口定义前端页面部分代码服务器代码Controller层service层Dao层modle层 Spring IoC定义传统程序开发解决方案IoC优势 Spring DIIoC &DI使用主要注解 Spring IoC详解bean的存储五…

git在IDEA中使用技巧

git在IDEA中使用技巧 merge和rebase 参考&#xff1a;IDEA小技巧-Git的使用 git回滚、强推、代码找回 参考&#xff1a;https://www.bilibili.com/video/BV1Wa411a7Ek?spm_id_from333.788.videopod.sections&vd_source2f73252e51731cad48853e9c70337d8e cherry pick …

榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案

无人共享经济下的技术革新 随着无人值守经济模式的快速发展&#xff0c;传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBootMySQLUniApp技术栈&#xff0c;结合物联网与移动互联网技术&#xff0c;为商家提供低成本、高可用的无人化运营解决方案。…

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据&#xff1a; 当前地图有3个图层&#xff0c;两个栅格图层和一个矢量图层 两个栅格图层&#xff1a;beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

考研408参考用书:计算机组成原理(唐朔飞)介绍,附pdf

我用夸克网盘分享了「《计算机组成原理》第2,3版 唐朔飞」&#xff0c; 链接&#xff1a;https://pan.quark.cn/s/6a87d10274a3 1. 书籍定位与适用对象 定位&#xff1a;计算机组成原理是计算机科学与技术、软件工程等专业的核心基础课程&#xff0c;涉及计算机硬件的底层工作原…

国网B接口云镜控制接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议云镜控制接口介绍B.8.1 接口描述B.8.2 接口流程B.8.3 接口参数B.8.3.1 SIP头字段B.8.3.2 SIP响应码B.8.3.3 XML Schema参数定义 B.8.4 消息示例B.8.4.1 云镜控制请求B.8.4.2 云镜控制请求响应 二、B接口云镜控制失败常见问题&#xff08;一&#xff09;网…

vue3使用keep-alive缓存组件与踩坑日记

目录 一.了解一下KeepAlive 二.使用keep-alive标签缓存组件 1.声明Home页面名称 三.在路由出口使用keep-alive标签 四.踩坑点1&#xff1a;可能需要配置路由&#xff08;第三点完成后有效可忽略&#xff09; 五.踩坑点2&#xff1a;没有找到正确的路由出口 一.了解一下Kee…

gpt2 本地调用调用及其调用配置说明

gpt2 本地调用调用及其调用配置说明 环境依赖安装&#xff0c;模型下载 在大模型应用开发中&#xff0c;需要学会本地调用模型&#xff0c; 要在本地环境调用gpt2 模型需要将模型下载到本地&#xff0c;这里记录本地调用流程&#xff1a; 在huggingface 模型库中查找到需要使…

【Abstract Thought】【Design Patterns】python实现所有个设计模式【下】

前言 彼岸花开一千年&#xff0c;花开花落不相见。 若问花开叶落故&#xff0c;彼岸缘起缘又灭——《我欲封天》 \;\\\;\\\; 目录 前言简单的设计模式复杂的设计模式13责任链14迭代器15备忘录16状态机17模板方法18访问者19观察者20命令Shell21策略22调解23解释器 简单的设计模…

【物联网】PWM控制蜂鸣器

文章目录 一、PWM介绍1.PWM的频率2.PWM的周期 二、PWM工作原理分析三、I.MX6ull PWM介绍1.时钟信号2.工作原理3.FIFO 四、PWM重点寄存器介绍1.PWM Control Register (PWMx_PWMCR)2.PWM Counter Register (PWMx_PWMCNR)3.PWM Period Register (PWMx_PWMPR)4.PWM Sample Register…