LeetCode-剑指51-数组中的逆序对

news2025/4/17 14:00:46

在这里插入图片描述

1、归并排序

我们可以利用归并排序在合并两个数组时会比较两个数组中的值来确定有多少逆序对。我们用左指针指向左边的数组,右指针指向右边的数组。每当左指针右移时,我们在总数上加上右指针指向位置与起始位置的差值即可。

class Solution {
public:
    int mergeSort(vector<int>& nums, vector<int>& tmp, int l, int r) {
        if (l >= r) {
            return 0;
        }

        int mid = (l + r) / 2;
        int inv_count = mergeSort(nums, tmp, l, mid) + mergeSort(nums, tmp, mid + 1, r);
        int i = l, j = mid + 1, pos = l;
        while (i <= mid && j <= r) {
            if (nums[i] <= nums[j]) {
                tmp[pos] = nums[i];
                ++i;
                inv_count += (j - (mid + 1));
            }
            else {
                tmp[pos] = nums[j];
                ++j;
            }
            ++pos;
        }
        for (int k = i; k <= mid; ++k) {
            tmp[pos++] = nums[k];
            inv_count += (j - (mid + 1));
        }
        for (int k = j; k <= r; ++k) {
            tmp[pos++] = nums[k];
        }
        copy(tmp.begin() + l, tmp.begin() + r + 1, nums.begin() + l);
        return inv_count;
    }

    int reversePairs(vector<int>& nums) {
        int n = nums.size();
        vector<int> tmp(n);
        return mergeSort(nums, tmp, 0, n - 1);
    }
};

2、离散化树状数组$$

我们可以是用树状数组来维护序列前缀和,利用 u p d a t e ( i , v ) update(i, v) update(i,v)来维护把序列 i i i位置的数加上一个值 v v v;利用 q u e r y ( i ) query(i) query(i)来维护区间 [ 1 , i ] [1,i] [1,i]的前缀和。我们可以根据数组中值的值域建立一个新的数组,其对应的位置上的值代表了每个值出现的次数,则区间 [ 1 , i − 1 ] [1,i-1] [1,i1]的前缀和代表了数组中小于当前值的个数。因此我们可以从后向前遍历数组,记当前遍历的元素为 a i a_i ai,而后将对应的值加一,将 i − 1 i-1 i1位置的前缀和加入答案中。

同时我们可以使用离散化进一步优化数组的空间,在维持数组大小相对不变的前提下进行去重。

class BIT {
private:
    vector<int> tree;
    int n;

public:
    BIT(int _n): n(_n), tree(_n + 1) {}

    static int lowbit(int x) {
        return x & (-x);
    }

    int query(int x) {
        int ret = 0;
        while (x) {
            ret += tree[x];
            x -= lowbit(x);
        }
        return ret;
    }

    void update(int x) {
        while (x <= n) {
            ++tree[x];
            x += lowbit(x);
        }
    }
};

class Solution {
public:
    int reversePairs(vector<int>& nums) {
        int n = nums.size();
        vector<int> tmp = nums;
        // 离散化
        sort(tmp.begin(), tmp.end());
        for (int& num: nums) {
            num = lower_bound(tmp.begin(), tmp.end(), num) - tmp.begin() + 1;
            // 第一个不小于num的数的位置
        }
        // 树状数组统计逆序对
        BIT bit(n);
        int ans = 0;
        for (int i = n - 1; i >= 0; --i) {
            ans += bit.query(nums[i] - 1);
            bit.update(nums[i]);
        }
        return ans;
    }
};

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

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

相关文章

基于stm32单片机自动灭火火灾报警装置Proteus仿真

资料编号&#xff1a;102 下面是相关功能视频演示&#xff1a; 102-基于stm32单片机自动灭火火灾报警装置Proteus仿真&#xff08;仿真源码全套资料&#xff09;功能介绍&#xff1a; 火焰传感器的原理&#xff1a;是通过感知外部特殊波段光照强度的突变来判断是否出现火灾&a…

[附源码]java毕业设计汽车租赁管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++11 原子变量

目录 什么时原子变量&#xff1f; atomic 类成员 原子变量的使用 C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 什么时原子变量&#xff1f; 原子操作 原子指的是一系列不被 CPU上下文交换的机器指令&#xff0c;这些指令组合在一起就形成了原子操作。…

Design A Twitter Search

title: Notes of System Design No.08 — Design a Twitter Search description: ‘Design a Twitter Search’ date: 2022-05-13 18:01:58 tags: 系统设计 categories: 系统设计 00. What is Twitter Search? 01.Functional Requirement 02. Non-Functional Requirement 03…

【JavaSE】阶段性小结,运用Java实现图书管理系统

文章目录逻辑分析主题框架具体方法添加书籍删除书籍查找书籍借阅书籍归还书籍展示书籍退出系统源码UserNormalUserAdmintUserBookBookListIOperationAddboookOperationDeletbookOperationFindbookOperationShowbookOperationBorrowbookOperationReturnbookOperationExitOperati…

[计算机毕业设计]关联挖掘的服装推荐系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

OS>>多线程

文章目录绪论SIGCHLDvolatile概念执行流并行与并发临界资源与临界区互斥和同步线程线程定义线程独立性线程优点线程缺点线程ID线程操作线程创建线程等待线程终止线程分离线程替换线程互斥与同步互斥同步原子性互斥锁/互斥量原理使用抢票情景模拟未加锁前加锁后代码锁使用规范重…

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09; 文章目录【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09;资料下载链接任务书设计说明书摘要设计框架架构…

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五

问题点 7&#xff1a; 关于BLE HIDS data 写入到Android 节点"/dev/uhid"的flow&#xff1b; 关于BLE中的HIDS&#xff0c;首先我们需要理解好角色的定义&#xff1a; GATT Server 作为HID Service 提供者&#xff0c;对应HID Device角色&#xff1b; GATT Client…

maven大全(概述、安装配置、使用步骤)

一、概述 1.什么是maven&#xff1f; 答&#xff1a; 全称是Apache Maven。专门用于管理和构建项目的工具 2.maven有什么作用&#xff1f; &#xff08;1&#xff09;提供了一套标准化的项目结构 官方&#xff1a; 就是使用的idea&#xff0c;eclipse编译器的项目结构不统…

基于Matlab的高压直流输电系统仿真研究

目录 摘要 I Abstract II 第1章 绪论 1 1.1 高压直流输电系统 1 1.2 高压直流输电系统的历史 1 1.3 高压直流输电系统的特点 1 1.4 我国高压直流输电系统的现状 2 1.5 高压直流输电技术的发展前景 5 第2章 高压直流输电控制基本原理 6 2.1 高压直流输电控制系统分层结构 6 2.2 …

领夹直播麦克风常规的使用方法及方案说明

麦克风多对我们来说并不陌生&#xff0c;但领夹式麦克风我们日常可能会用的比较少&#xff0c;像做自媒体、采访等会用到的比较多&#xff0c;它能收到人说话的声音&#xff0c;避开外界嘈杂的声音。接下来我们一起来了解一下领夹式麦克风的相关知识吧&#xff01; 一、领夹式麦…

Win11系统启动文件夹是空的怎么解决?

Win11系统启动文件夹是空的怎么解决&#xff1f;有用户发现自己系统的启动文件夹里面没有任何的文件&#xff0c;这样可能会导致我们的电脑出现问题&#xff0c;导致无法正常的启动桌面程序。那么如何去解决这个问题&#xff0c;一起看看具体的解决方法分享吧。 解决方法&#…

从I/O的视角看DPU

计算的流动性 随手翻开一个公有云&#xff0c;都会发现有不同的计算实例&#xff0c;搭配不同的CPU、内存、网络和存储来应对不同业务的需求. 当云原生和大量的新技术出现后&#xff0c;作为公有云考虑的最重要的一件事情就是提供这些丰富服务的成本: 青云、Ucloud也都在A股上…

[Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

牛客网-《刷C语言百题》第五期

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《C语言入门必刷百题》 &#x…

计算机毕业设计ssm+vue+elementUI高校志愿者服务招募网站

项目介绍 随着我国教育制度的改革和社会的进步&#xff0c;越来越多的人希望加入志愿者这个行列从而贡献自己的一份爱。加入志愿者不仅能够更好的锻炼自己&#xff0c;也可以帮助那些需要帮助的人&#xff0c;从而让社会变的更加温暖和美好&#xff0c;尤其是对比较发达的地区…

基于matlab创建基于物理统计的雷达模型(附源码)

目录 一、前言 二、、定义场景 三、定义用于检测生成的雷达 四、生成统计雷达检测 五、定义用于 IQ 信号生成和处理的雷达 六、IQ 信号和处理仿真 七、总结 八、程序 一、前言 此示例演示如何以编程方式从统计雷达模型创建基于物理的雷达模型。 雷达是一种感知系统&…

Zookeeper的功能简介

1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff…

超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较

接上一篇继续往下挖&#xff0c;在上一篇&#xff0c;我们实现了一个属于自己的动态数组。利用这个动态数组&#xff0c;我们来实现一个基于动态数组&#xff0c;一个属于自己的普通队列Queue。 Queue 是一种它许我们从表的一段进行删除&#xff0c;表的另一端进行插入的线性表…