交易逆序对的总数

news/2024/5/17 17:12:45 标签: leetcode, java, 算法, 数据结构, 归并排序

题目链接

交易逆序对的总数

题目描述

注意点

  • 0 <= record.length <= 50000

解答思路

  • 本题是归并排序的扩展,可以先进入手撕归并排序了解
  • 利用归并排序进行合并时,对于左侧区间当前的首个元素leftNum,不论右侧区间当前的首个元素rightNum是否比leftNum大,只要右区间指针不在初始位置,说明右区间都有元素比leftNum小,leftNum对逆序对是有贡献的,具体贡献多少需要找到右区间所有比其小的元素数量,所以还需要继续移动右区间指针直到右区间首个元素比leftNum大或遍历完右区间为止,贡献值就是右区间指针从初始位置移动的步数

代码

java">class Solution {
    int res;
    public int reversePairs(int[] record) {
        res = 0;
        mergeSort(record, 0, record.length - 1);
        return res;
    }

    public int[] mergeSort(int[] record, int left, int right) {
        if (left > right) {
            return null;
        }
        if (left == right) {
            return new int[] {record[left]};
        }
        int mid = (left + right) / 2;
        int len = right - left + 1;
        int[] leftArr = mergeSort(record, left, mid);
        int[] rightArr = mergeSort(record, mid + 1, right);
        int[] mergeArr = new int[len];
        int leftIdx = 0, rightIdx = 0;
        while (leftIdx < leftArr.length || rightIdx < rightArr.length) {
            // 左区间已遍历完,右区间数组后续值都比左区间大
            if (leftIdx >= leftArr.length) {
                mergeArr[leftIdx + rightIdx] = rightArr[rightIdx++];
                continue;
            }
            // 找到左区间比右区间哪些数更大
            while (rightIdx < rightArr.length && leftArr[leftIdx] > rightArr[rightIdx]) {
                mergeArr[leftIdx + rightIdx] = rightArr[rightIdx++];
            }
            mergeArr[leftIdx + rightIdx] = leftArr[leftIdx++];
            res += rightIdx;
        }
        return mergeArr;
    }
}

关键点

  • 归并排序的思想
  • 怎么通过归并的步骤找到某个元素对逆序对总数的贡献
  • 注意边界问题

http://www.niftyadmin.cn/n/5304170.html

相关文章

【Redux】自己动手实现redux和react-redux

1. React提供context的作用 在class组件的世界里&#xff0c;如果后代组件共享某些状态&#xff0c;比如主题色、语言键&#xff0c;则需要将这些状态提升到根组件&#xff0c;以props的方式从根组件向后代组件一层一层传递&#xff0c;这样则需要在每层写props.someData&#…

在k8s集群中部署多nginx-ingress

关于ingress的介绍&#xff0c;前面已经详细讲过了&#xff0c;参考ingress-nginx详解和部署方案。本案例ingress的部署使用deploymentLB的方式。 参考链接&#xff1a; 多个ingress部署 文章目录 1. 下载ingress的文件2. 文件资源分析3. 部署ingress3.1 部署第一套ingress3.1…

实验笔记之——下载数据到服务器

开发过程中经常需要把数据传到服务器上&#xff0c;太麻烦了&#xff0c;为此本博文记录采用百度云来传输数据 百度云 使用bypy包。 安装&#xff1a;pip install bypy 配置bypy连接百度网盘&#xff1a; 终端输入bypy info将命令行提示的链接复制到浏览器&#xff0c;并复制…

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…

分布式(9)

目录 41.常见的JOB实现方案&#xff1f; 42.Cookie和Session有什么区别&#xff1f; 43.谈谈会话技术的发展&#xff1f; 44.分布式会话有哪些解决方案&#xff1f; 45.什么是Session Stick&#xff1f; 41.常见的JOB实现方案&#xff1f; 基于上面Java任务演化出分布式J…

CentOS上设置中文/英文语言环境

一、在CentOS上设置中文语言环境 1、安装中文字体支持&#xff1a; sudo yum install -y wqy-microhei-fonts2、设置系统默认语言为中文&#xff1a; sudo localectl set-locale LANGzh_CN.UTF-83、重新启动系统&#xff0c;以便应用语言更改&#xff1a; sudo reboot二、在…

数据结构与算法(九)图链式存储

邻接表 度&#xff1a;无向图的度&#xff1a;顶点与邻接点连接的边就做度。有向图的度&#xff1a;指向顶点的边叫做入度&#xff0c;由顶点指向其他邻接点的边叫做出度 顶点&#xff1a;存储自身顶点信息和指向下一个临界点的指针 邻接点&#xff1a;保存临接点的存储下标…

每日一题——LeetCode1046.最后一块石头的重量

方法一 暴力排序 保证数组从小到大排序&#xff0c;所以最后两个就是最大的石头&#xff0c;每次取最后两个元素进行比较&#xff0c;一样重就直接下一次循环&#xff0c;不一样重就把两个石头重量差push进数组&#xff0c;把数组再次排序 循序嵌套sort排序时间复杂度较高&am…