当前位置: 首页 > news >正文

【算法面试必刷Java版二十】数组中的逆序对

盲目刷题,浪费大量时间,博主这里推荐一个面试必刷算法题库,刷完足够面试了。传送门:牛客网面试必刷TOP101

🏄🏻作者简介:CSDN博客专家,华为云云享专家,阿里云专家博主,疯狂coding的普通码农一枚

    

🚴🏻‍♂️个人主页:莫逸风

    

👨🏻‍💻专栏题目地址👉🏻牛客网面试必刷TOP101👈🏻

    

🇨🇳喜欢文章欢迎大家👍🏻点赞🙏🏻关注⭐️收藏📄评论↗️转发

alt

题目:数组中的逆序对

描述:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007

数据范围: 对于 50% 的数据, size≤104
对于 100% 的数据, size≤105

数组中所有数字的值满足0≤val≤1000000

要求:空间复杂度 O(n),时间复杂度 O(nlogn)

题目保证输入的数组中没有的相同的数字

思路:归并排序

归并排序遵循分治思想,先分后治。

  1. 划分阶段:将待划分区间从中点划分成两部分;
  2. 排序阶段:使用归并排序递归地处理子序列,同时统计逆序对;
  3. 合并阶段:将排好序的子序列合并,同时累加逆序对。

请添加图片描述

代码:

public int InversePairs(int [] array) {
    int n = array.length;
    int[] res = new int[n];
    return mergeSort(0, n - 1, array, res);
}

public int mod = 1000000007;
public int mergeSort(int left, int right, int [] data, int [] temp){
    if (left >= right)    // 停止划分
        return 0;
    int mid = (left + right) / 2; //取中间
    int res = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data, temp); //左右划分
    res %= mod;  //防止溢出
    int i = left, j = mid + 1;
    for (int k = left; k <= right; k++)
        temp[k] = data[k];
    for (int k = left; k <= right; k++) {
        if (i == mid + 1)
            data[k] = temp[j++];
        else if (j == right + 1 || temp[i] <= temp[j])
            data[k] = temp[i++];
        else { //左边比右边大,答案增加
            data[k] = temp[j++];
            res += mid - i + 1; // 统计逆序对
        }
    }
    return res % mod;
}

推荐牛客网面试必刷算法题库,刷完足够面试了。传送门:牛客网面试必刷TOP101

相关文章:

  • Postman接口断言上下游参数传递
  • Amazon S3 Compatibility 兼容API 封装AWS S3工具类 生成预前面url跨域问题解决
  • 请问各位大神如何写论文的摘要?
  • C++ 基础语法
  • 什么是ForkJoin
  • OpenCV-漫水填充cv::floodFill
  • 【精品】SpringSecurity在前后端分离项目中的应用
  • MySQL知识点总结_1
  • 深入理解Python生成器
  • SpringBoot+Vue项目校园商铺系统
  • “不学数学就去当厨子”,兰大校友入选全球竞赛最强10人,决赛最后几小时才想起做题...
  • Python基础_判断语句(if、elif、else)、if 嵌套、逻辑运算符(and、or、not )、随机数的处理
  • 【C语言】小游戏系列——扫雷(内含详细过程)
  • C++系列文章 —— 类和对象篇(上)(从入门到精通合集)
  • 7.5 文件系统
  • C学习-枚举(九)
  • JS题目及答案整理
  • log4j2输出到kafka
  • Nacos系列:Nacos的Java SDK使用
  • SQLServer插入数据
  • 多线程 start 和 run 方法到底有什么区别?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深入浅出webpack学习(1)--核心概念
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 怎样选择前端框架
  • nb
  • const的用法,特别是用在函数前面与后面的区别
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #14vue3生成表单并跳转到外部地址的方式
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (10)STL算法之搜索(二) 二分查找
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (分布式缓存)Redis持久化
  • (黑马C++)L06 重载与继承
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)vue-router+UI组件库
  • .gitignore文件设置了忽略但不生效
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 的程序集加载上下文
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET命名规范和开发约定
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @angular/cli项目构建--Dynamic.Form
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ABC294Ex] K-Coloring
  • [Android] 修改设备访问权限
  • [ARM]ldr 和 adr 伪指令的区别
  • [C]编译和预处理详解
  • [C++]模板与STL简介
  • [c语言]小课堂 day2
  • [FUNC]判断窗口在哪一个屏幕上