【牛客刷题】BM20 数组中的逆序对

简介: 【牛客刷题】BM20 数组中的逆序对

正文


题目


09.png


题解


归并排序得结果


问题转化:求逆序对就是统计有多少个前大后小的数对,问题和归并两个有序数组求前大后小数对一样。所以现在的问题变为统计子问题中逆序对的个数。


递归模型变形:递归按照标准的归并排序来,注意的是统计个数,当出现nums[i]>nums[j]时,统计所有前半段区间内比nums[j]大的数及为ans+=m-i+1;(为了理解方便lm前半段,m+1r后半段)


边界注意:

  • i == r+1当前半段已经统计完,剩下后半段归并,证明j后的数都是比nums[m]大的,无需统计
  • j == l+1当后半段统计完,剩下前半段归并,i后的数都比num[l]大,但在之前已经统计个数,无需统计 alt

009.png

public class Solution {
    int[] nums,temp;
    public int merge_sort(int l,int r){
        if(l>=r)return 0;
        int m, i, j, k;
        long res;
        m = (l+r)/2;
        res = (merge_sort(l,m)+merge_sort(m+1,r))%1000000007;
        //merge
        for(k=l;k<=r;k++)temp[k]=nums[k];
        i = l;j = m+1;k = l;
        for(k=l;k<=r;k++){
            if(i==m+1)nums[k]=temp[j++];
            else if(j==r+1||temp[i]<=temp[j])nums[k] = temp[i++];
            else {
                res=(res + m-i+1)%1000000007;
                nums[k]=temp[j++];
            }
        }
        return (int)res;
    }
    public int InversePairs(int [] array) {
        nums = array;
        temp = new int[array.length];
        return merge_sort(0,array.length-1);
    }
}
相关文章
|
Python 容器
在Python中,键值对(key-value pair)结构
在Python中,键值对(key-value pair)结构
838 1
|
Cloud Native 关系型数据库 程序员
使用Docker部署自动化CI/CD平台Drone
[Drone](https://drone.io) 是一个现代化的持续集成平台,能够使用强大的云原生管道引擎自动化他们的构建、测试和发布工作流程,让我们不再关注程序如何发布而是如何去实现,去更好的实现。
使用Docker部署自动化CI/CD平台Drone
|
机器学习/深度学习 人工智能 网络架构
YOLOv5架构详解
YOLOV5神经网络架构详解
3700 0
|
XML 数据挖掘 Linux
服务器丨Linux安装测试单细胞分析软件copykat,遇到的常见报错与解决思路与方法
服务器丨Linux安装测试单细胞分析软件copykat,遇到的常见报错与解决思路与方法
|
弹性计算 Linux 开发工具
幻兽帕鲁服务器如何设置/修改密码
介绍了如何设置幻兽帕鲁服务器的密码,以及需要密码才可以加入到服务器中教程
15858 6
幻兽帕鲁服务器如何设置/修改密码
|
缓存 前端开发 Serverless
Vercel 部署 Node 服务
Vercel 部署 Node 服务
2347 0
Vercel 部署 Node 服务
|
11月前
|
人工智能 监控 安全
借助API,淘宝京东拼多多卖家轻松应对市场变化
在电商竞争中,淘宝、京东、拼多多卖家常面临库存、定价、订单等难题。借助API技术,可实现库存同步、动态调价、智能订单处理、数据预测与客服整合,提升效率300%。API正成为电商智能化运营的核心引擎,助力商家精准决策、高效增长。(238字)
|
4月前
|
存储 监控 Java
【Java并发编程】线程池:核心7大参数、执行原理、execute() vs submit()、拒绝策略、参数设计、动态线程池、线程池隔离(附《思维导图》+《面试高频考点清单》)
本文系统梳理Java线程池全体系知识:涵盖7大核心参数原理、任务执行四步流程、execute与submit本质区别、4种拒绝策略适用场景、CPU/IO密集型线程数计算方法,并强调禁用Executors、必用有界队列、自定义线程工厂等生产级最佳实践,助力高效并发编程与面试通关。
|
JavaScript 数据可视化 算法
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
481 6
|
前端开发 rax 网络协议
x64汇编语言与逆向工程基础指南(一)
x64汇编语言与逆向工程基础指南(一)
3051 0