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

可视化图解算法43:数组中的逆序对

1. 题目

​牛客网 面试笔试TOP101    

描述

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

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

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

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

输入描述:

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

示例1

输入:

[1,2,3,4,5,6,7,0]

返回值:

7

示例2

输入:

[1,2,3]

返回值:

0

2. 解题思路

在解题之前一定要明确题目给定的逆序对的含义:

4对逆序对为:(1,0)、(2,0)、(3,0)和(4,0)。

逆序对的求解可借助归并排序思路完成,即在归并排序中的合并阶段完成逆序对的计算。因此本题的核心是归并排序。

归并排序分为二分与合并两个阶段,具体如下图所示:

  • 在合并(排序)阶段的最后一行,由于7与0和并时,为逆序,因此这一行的逆序对为1

  • 在合并(排序)阶段的倒数第二行,由于5、6与0、7和并时,(5,0)、(6,0)构成逆序对,因此这一行的逆序对为2

  • 在合并(排序)阶段的第二行,由于1、2、3、4与0、5、6、7和并时,(1,0)、(2,0)、(3,0)、(4,0)构成逆序对,因此这一行的逆序对为4

最后将每一行的逆序对累加,即:1+2+4。

关键点:

arr1 [1、2、3、4]与arr2 [0、5、6、7]逆序对求解时,arr1中的元素1与arr2中的元素0构成逆序,由于arr1为有序的(已经排好序了),那么arr1中的元素1之后的元素也与arr2中的元素0构成逆序对。因此逆序对可以这样计算:

len(arr1) - i = 4 - 0 = 4

用数组arr1的长度减去元素1在arr1中所处的位置。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1372589

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367845

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364843

3. 编码实现

核心代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param array int整型一维数组* @return int整型*/
var count = 0func InversePairs(array []int) int {// write code hereif len(array) < 2 {return 0}mergeSort(array)return count % 1000000007
}// 归并排序
func mergeSort(array []int) []int {//2. 终止条件:数组的元素个数小于等于1个if len(array) <= 1 {return array}//1.递归步骤//1.1 将数组分为两部分mid := len(array) / 2leftArr := array[:mid]rightArr := array[mid:]//1.2 递归分割,直到不能在分割left := mergeSort(leftArr)right := mergeSort(rightArr)// 1.3. 并(排序)return merge(left, right)
}func merge(left []int, right []int) []int {res := make([]int, 0, len(left)+len(right))i, j := 0, 0n := len(left)// 合并两个切片for i < len(left) && j < len(right) {if left[i] <= right[j] {res = append(res, left[i]) //将左部分的内容追加i++} else {res = append(res, right[j])j++                     //将右部分的内容追加count = count + (n - i) //右部分数据小,需要追加到目标数组中,对应的逆序对为:左部分数组中未比较的长度}}// 如果左侧切片还有剩余元素,将其追加到res中for i < len(left) {res = append(res, left[i])i++}// 如果右侧切片还有剩余元素,将其追加到res中for j < len(right) {res = append(res, right[j])j++}return res
}
 

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:Python数据结构LeetCode笔试面试算法_哔哩哔哩_bilibiliPython数据结构LeetCode笔试面试算法,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1372589

  • Java版本:LeetCode数据结构笔试面试算法-Java版_哔哩哔哩_bilibiliLeetCode数据结构笔试面试算法-Java版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1367845

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364843

4.小结

数组中逆序对的求解可借助归并排序思路完成,即在归并排序中的合并阶段完成逆序对的计算。


《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

        ✅   链表

        ✅   二叉树

        ✅   二分查找、排序

        ✅   堆、栈、队列

        ✅   回溯算法

        ✅   哈希算法

        ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:LeetCode数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibiliLeetCode数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ss63997

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:好风凭借力,送我上青云。

http://www.xdnf.cn/news/584371.html

相关文章:

  • 鸿蒙Flutter实战:24-混合开发详解-4-初始化Flutter
  • 鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面
  • [Flutter]Completer和compute
  • 计量单片机 RN8302:特性、使用与应用
  • 【人工智障生成日记1】从零开始训练本地小语言模型
  • 【无标题】西门子S7-1500PLC与西门子V90 PN伺服通讯控制项目程序项目程序,共有8轴,编码器信号直接输入到变频器内。
  • 系统架构设计(十八):ATAM
  • 《棒球百科》棒球运动规则·棒球1号位
  • 【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案
  • 免费轻量便携截图 录屏 OCR 翻译四合一!提升办公效率
  • 解决weman框架redis报错:Class “llluminatelRedis\RedisManager“ not found
  • 【Java高阶面经:数据库篇】18、分布式事务:如何在分库分表中实现高性能与一致性?
  • 零基础设计模式——第二部分:创建型模式 - 原型模式
  • HCIP(广域网)
  • Normalized Blind Deconvolution论文阅读
  • UART串口两种连接方式
  • 笔记本6GB本地可跑的图生视频项目(FramePack)
  • EtpBot:安卓自动化脚本开发神器
  • 了解Android studio 初学者零基础推荐(2)
  • 正则表达式篇
  • element ui 表格实现单选
  • v2.0 技术篇目录-研究生如何选择编程技术
  • iOS工厂模式
  • uniapp-商城-65-shop(1-品牌信息显示,将数据库信息同步到vuex的state)
  • 如何构建一个简单的AI Agent(极简指南)
  • 深度学习入门到实战:用PyTorch打通数学、张量与模型训练全链路​
  • 使用 A2A Python SDK 实现 CurrencyAgent
  • 开闭原则 (Open/Closed Principle, OCP)
  • leetcode hot100刷题日记——10.螺旋矩阵
  • day33 python深度学习入门