leetcode 剑指offer51:数组中的逆序对 归并排序

【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解) LCR 170. 交易逆序对的总数,使用归并排序的思想以O(nlogn)的时间复杂度解决逆序对问题。使用大量画图方式让读者更加任意理解解题思路以及归并排序的精髓。 阅读详情

题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例:
输入: [7,5,6,4]
输出: 5

限制:0 <= 数组长度 <= 50000

思路1: 暴力求解 遍历两趟 但是会超时,看到那个限制范围就可以推断出来

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        # 超时
        count = 0
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                if nums[i] > nums[j]:
                    count += 1
        return count

思路2:
采用归并排序,归并排序的思想就是逆序的调换过来,这样在调换的过程就可以统计逆序对的数量;主要参考的题解链接
在这里插入图片描述
「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
分: 不断将数组从中点位置划分开(即二分法),将整个数组的排序问题转化为子数组的排序问题;
治: 划分到子数组长度为 1 时,开始向上合并,不断将 较短排序数组 合并为 较长排序数组,直至合并至原数组时完成排序;
合并阶段 本质上是 合并两个排序数组 的过程,而每当遇到 左子数组当前元素 > 右子数组当前元素 时,意味着 「左子数组当前元素 至 末尾元素」 与 「右子数组当前元素」 构成了若干 「逆序对」 。 用两个指针完成。

算法流程:
merge_sort() 归并排序与逆序对统计:
终止条件: 当 l≥r 时,代表子数组长度为 1 ,此时终止划分;
递归划分: 计算数组中点 m ,递归划分左子数组 merge_sort(l, m) 和右子数组 merge_sort(m + 1, r) ;
合并与逆序对统计:
暂存数组 nums 闭区间 [i,r] 内的元素至辅助数组 tmp ;
循环合并: 设置双指针 i , j 分别指向左 / 右子数组的首元素;(注意下面四个情况的讨论顺序是必要的,不然将会出现数组越界)
当 i=m+1 时: 代表左子数组已合并完,因此添加右子数组当前元素 tmp[j] ,并执行j=j+1 ;
否则,当 j=r+1 时: 代表右子数组已合并完,因此添加左子数组当前元素 tmp[i] ,并执行i=i+1 ;
否则,当tmp[i]≤tmp[j] 时: 添加左子数组当前元素tmp[i] ,并执行 i=i+1;
否则(即 tmp[i]>tmp[j])时: 添加右子数组当前元素tmp[j] ,并执行 j=j+1 ;此时构成 m−i+1 个「逆序对」,统计添加至 res ;
返回值: 返回直至目前的逆序对总数 res ;
代码:

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        def merge_sort(l, r):
            if l >= r:
                return 0
            m = l + (r-l)//2
            res = merge_sort(l, m) + merge_sort(m+1, r)
            temp[l:r+1] = nums[l:r+1]
            i, j = l, m+1
            for k in range(l, r+1):  # 注意下面四个情况的讨论顺序是必要的,不然将会出现数组越界)
                if i == m+1:
                    nums[k] = temp[j]
                    j += 1
                elif j == r + 1:
                    nums[k] = temp[i]
                    i += 1
                elif temp[i] <= temp[j]:
                    nums[k] = temp[i]
                    i += 1
                elif temp[i] > temp[j]:
                    nums[k] = temp[j]
                    j += 1
                    res += m+1-i
            return res

        temp = [0] * len(nums)
        r = merge_sort(0, len(nums)-1)
        # print(nums)
        return r
【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别) 阅读详情

相关推荐

模型算力需求估算

(Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。

形上得其象,形下合于数;阴阳自济,玄理自明。 8955

用归并排序解决数组逆序对问题

吐槽一下这个题目,题目说的好歹清楚一些啊,我看半天以为是相邻的两个数字算是逆序对,写了半天没给我过,看题解才知道是什么意思。还有,这个%1000000007是什么鬼啊???为什么要弄个这种东西。 言归正传,这道题用到了归并排序的思想,其实暴力法也行,但是会提示超时。 解题思路就是按照归并排序的思想,在归并左右两个数组的时候进行计数操作 由于归并left和right的时候已经默认排好序了,所以一旦出现left[i]>right[j]的情况,则left[i]后边的数(比如left[i+1],left[i.

Currybeefer的博客 358

车载面试题目(ADAS)

多数功能都是依靠的前置传感器(经过Lidar、Radar、Camera融合),比如ACC、AEB、LKA、NOA、TJA、FCW等,只有少数涉及周视传感器,比如BSD、CVW、DOW。③如果前面有车切速度小于自车车速,自车减速对减速度有要求,比如3.5m/m2,④如果前车静止了,自车有个跟停距离要求,比如2-3m。试验场有不同曲率的弯道,比如125m、250m、500m的,根据需求跟车行驶,看是否会减速,能不能驶出弯道等。迭代内容:底层通讯、网络管理、诊断、刷写、信息安全、OTA。

qq_43475097的博客 2298

归并排序思想的应用:求逆序对

前言 学了这么久的归并排序,感觉没什么卵用。。。。而且STL中有sort这么强大的工具,归并排序早就吃灰了 先回顾下什么是归并排序 要想知道什么是归并排序,先看看什么是归并 举个例子:将两个已经排好序(例如从小到大)的数组合并成一个有序数组,要求时间复杂度O(n) 用two-pointer的思想很好解决,用一个pointer指向第一个数组,另一个指向第二个数组,比较两个pointer所指...

Chuancey的博客 329

让 ABAP 开发更聪明的搭档:SAP Joule for Developers 与 ABAP AI Capabilities 全面实战

摘要:SAP已将生成式AI集成到ABAP开发工具中,推出Joule for Developers功能。该功能直接嵌入Eclipse开发环境,提供代码解释、生成、测试构造和遗留代码迁移等辅助功能。Joule支持ABAP Cloud项目开发,能围绕当前开发对象提供上下文相关的建议,帮助开发者高效完成应用开发与迁移任务。启用该功能需升级ADT并获取相应许可,典型应用场景包括RAP应用构建和S/4HANA迁移中的代码重构。官方资源提供了多个实践案例,帮助开发者快速上手这一AI辅助开发功能。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 492

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3864

【leetcode】数组中的逆序对-归并算法总结

数组中的逆序对 记录下这个解题的思路以及归并排序的意义 思路一:暴力,双重for循环 int reversePairs(vector<int>& nums) { int count = 0; int len = nums.size(); for (int i = 0; i < len - 1; ++i) { for (int j =...

Wiley、Z’s blog 461

用 Custom Entity 打造 RAP Value Help:从能跑到好用的深度踩坑笔记

本文介绍了在RAP项目中实现Value Help(Fiori输入帮助)的完整流程。通过Custom Entity方式,开发者可以灵活构建不依赖数据库实体的值帮助功能,但需手动实现CDS原本提供的过滤、排序、分页等能力。文章以一个典型场景为例,详细说明了如何为Partner维护界面的City字段创建可搜索的值帮助,包括创建查询实现类、绑定CDS Custom Entity、服务发布等关键步骤,并特别指出了处理排序分页请求等常见问题。最后强调在ABAP Cloud环境下需要自行实现查询能力,而非依赖传统工具类。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 140

leetcode 493. Reverse Pairs 逆序对数量 + 归并排序做法

Given an array nums, we call (i, j) an important reverse pair if i 2*nums[j]. You need to return the number of important reverse pairs in the given array. Example1: Input: [1,3,2,3,1] Output: 2

JackZhangNJU的专栏 3422

海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

海康visionmaster开发笔记10-HALCON第三方算子到VM工具箱的方法

视觉人机器视觉的博客 4347

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

#数组中的逆序对#一文搞懂递归归并排序数组,链表纯C语言

力扣912.排序数组 int* sortArray(int* nums, int numsSize, int* returnSize){ *returnSize=numsSize; guibing(nums,numsSize); return nums; } void guibing(int *nums,int numsSize) { if(numsSize<2) return 0; int mid=(numsSize+1)>>1;

qq326076079的博客 758

微信文件自动归档!手把手教你用OpenClaw搭个自己的“数字员工”,告别重复劳动

很多人说“AI是未来”,但未来不是靠喊口号的。OpenClaw的真正价值,是让你把重复劳动交出去,把时间留给真正需要创造力的事。这事真能干,而且不难。下载OpenClaw(GitHub仓库按我写的步骤跑一遍遇到坑,评论区留言——我亲自帮你看作者后记:上周五,我让AI自动归档了文件后,终于在5点准时下班。回家路上,我给它发了条消息:“干得漂亮”。它没回,但我知道——它在默默等我的下一条指令。

2601_94871597的博客 414

【LeetCode】剑指 Offer(26)

剑指 Offer 51. 数组中的逆序对

Locky136的博客 1303

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【LeetCode & 剑指offer刷题】数组题16:51 数组中的逆序对

【LeetCode &amp; 剑指offer刷题】数组题16:51 数组中的逆序对 【LeetCode &amp; 剑指offer 刷题笔记】目录(持续更新中...) 51 数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000...

技术改变世界 1588

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-...

Michael是个半路程序员 1665

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

7.5 分治:归并:LeetCode 剑指 Offer 51.数组中的逆序对

归并排序巧解逆序对问题:LeetCode 剑指 Offer 51.数组中的逆序对

shuibuxingaaa的博客 965

【剑指Offer】51. 数组中的逆序对

力扣 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 思路 归并 两区间及跨区间 class Solution { public int reversePairs(int [] array) { int len = array.length; if(len < 2) retur

瑞新の博客:bennyrhys 990

leetcode 剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 以下内容部分来自威威大佬: 作者:liweiwei1419 链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/bao-li-jie

Qin_酱的博客 309

力扣【剑指offer】题目汇总与总结

本文为《剑指offer》刷题笔记的总结,花费不到两个月的时间将力扣上《剑指offer》的75道题刷了一遍,遇到不会的知识点或者应该做一些记录的题目都将其写在了往日的博客里。 整体来看,这75道题,涉及到常用的数据结构:数组、字符串、链表、栈、队列、树、图,还有一些常用的数据操作和算法:二分法、哈希表、递归、排序、查找、位运算、动态规划、回溯、滑动窗口、双指针、深度优先搜素(DFS)、贪心。 1、数组 (1)剑指offer03.数组中重复的数字。 (2)剑指offer04.二维数组中的查找。解法:找标

华辰烟雨的博客 6万+

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

剑指offer51---数组中的逆序对 计算右侧小于当前元素的个数 翻转对

m0_74910646的博客 1382

(排序) 剑指 Offer 51. 数组中的逆序对 ——【Leetcode每日一题】

剑指 Offer 51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

weixin_43412762的博客 1549

剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对题目描述方法一:二分法方法二:归并排序 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof 方法一:二分法

GridWorker 645

剑指offer.51 --- 数组中的逆序对

数组中的逆序对数组中的逆序对 数组中的逆序对 题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 首先想到的方法是暴力解法,用2个for循环遍历数组,比较前一个和后一个的大小,时间复杂度为O(N^2),这里给的数字范围很大,这个方法明显就不行了。 class Solution { public: int reversePairs(vector<int>& nums) {

weixin_45599288的博客 1688

将数组中的数逆序存放_归并排序求逆序对?图解:剑指Offer 51 数组中的逆序对

这周给大家分享一道力扣题目:剑指 Offer 51. 数组中的逆序对这个问题在各个大厂的面试中经常出现,因为他真的太经典,太完美!题目描述 剑指 Offer 51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。逆序对的数目可以标识一个数组和有序数组之间的距离,逆序对的数目越少,也数组变成有序数组的步数就...

weixin_39807896的博客 456

剑指Offer-51:数组中的逆序对(InversePairs)

一、题目描述 二、解题思路 典型的归并排序方法 怎么计算count呢? 在每次归并进行比较时 如果nums[i] <= nums[j]:说明当前位置没有逆序,继续向下比较; 如果nums[i] > nums[j],说明在前半段中,位置i的已经都比nums[j]大了 前半段中位置i及其后面的数字一定比nums[j]大。 确定前半段比nums[j]大的个数:注意是“在前半段中i及其后...

weixin_44587168的博客 403
上一篇: leetcode 剑指offer 17. 打印从1 到n的最大n位数 (大数打印)
下一篇: leetcode 剑指offer 14:剪绳子
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值