数组中的逆序对

【剑指offer】数组中的逆序对 思路:最简单的方法是顺序数组,将每个数字与后面的比较,统计逆序对的个数,这种方法的时间复杂度为O(n*n),这种方法写出的代码在九度OJ上测试,会超时。剑指offer给出了归并排序的思路,这个有点难想到啊,也可能是我太弱了,根本没往这方面想!理解了思路,就不难了,将数组划分成两个子数组,再将子数组分别划分成两个子数组,统计每个子数组内的逆序对个数,并将其归并排序,再统计两个子数组之间的逆序对个数,并进行归并排序。这就是归并排序的变种,在归并排序代码的基础上稍作改进即可。 合理还要注意一点:全局变量c 阅读详情

题目描述

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

输入描述:

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

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

示例1

输入

复制

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

输出

复制

7

方法一:暴力

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        count=0
        n=len(data)
        for i in range(n-1):
            for j in range(1+i,n):
                if data[i]>data[j]:
                    count+=1
        return count

方法二:索引

import copy
def InversePairs(data):
    count = 0
    copys = copy.copy(data)
    # copys=data[:]
    # copys = copy.deepcopy(data)
    copys.sort()
    for i in range(len(copys)):
        count += data.index(copys[i])
        print('count=',count)
        data.remove(copys[i])
    return count
    # return count%1000000007
a=[1,2,3,5,6,7,4]
print(InversePairs(a))

方法三:归并

class Solution:
    def reversePairs(self, nums: List[int]) -> int:

        def f(L,R):
            if L>=R:
                return 0
            mid=(L+R)//2
            s=f(L,mid)+f(mid+1,R)
            i=L
            j=mid+1
            pos=L
            res=[]
            while i<=mid and j<=R:
                if nums[i]<=nums[j]:
                    # res.append(nums[i])
                    dp[pos]=nums[i]
                    i+=1
                else:
                    # res.append(nums[j])
                    dp[pos]=nums[j]
                    j+=1
                    s=s+(mid-i+1)
                pos+=1
            for k in range(i,mid+1):
                dp[pos]=nums[k]
                pos+=1
                # res.append(nums[i])
            for k in range(j,R+1):
                dp[pos]=nums[k]
                pos+=1
                # res.append(nums[i])
            nums[L:R+1]=dp[L:R+1]
            return s
        l=len(nums)
        dp=[0]*l
        return f(0,l-1)
class Solution:
    def InversePairs(self, data):
        # write code here
        # 思路:归并排序。分为两个部分,寻找两个部分内部的逆序列,再寻找两个部分之间交叉的逆序列。
        if not data:
            return 0
        # assist中存储的是排好序的列表,它也是下一次Merge时作为参考的列表,因此除了本次迭代内的片段,其他部分也要等于原始列表
        # 由于必须保证有两个列表,两个地址,因此不能直接用assist=data
        assist = [i for i in data]
        return self.Merge(data, assist, 0, len(data) - 1) % 1000000007

    # 每一个新的递归开始时,都是要大范围重新排序的,这个范围会覆盖所有以前递归过的片段,因此data和assist可以互换,因为上一次排好序的列表只在下一次的比较时需要使用,而不需要递延到下一次的辅助列表中。
    def Merge(self, data, assist, low, high):
        # 判断终止条件:如果子部分里面只剩下1个数,此时low=high,不用比较,返回0
        if low == high:
            assist[low] = data[low]  # 由于assist和data互换了,因此如果递归到最小单位,要按照上次算出的排序方式排序
            return 0
        mid = (low + high) / 2
        left = self.Merge(assist, data, low, mid)
        right = self.Merge(assist, data, mid + 1, high)
        # 开始归并排序
        count = 0
        i = mid
        j = high
        k = high  # k为assist列表的索引
        # 从后往前进行遍历,对左子列和右子列中的数进行比较大小
        while i >= low and j > mid:
            # 如果左子列最后一个数大于右子列最后一个数,表示左子列大于右子列所有的数
            if data[i] > data[j]:
                count += j - mid  # count要加上右子列中剩下元素的个数
                assist[k] = data[i]  # 将最大的数存入辅助列表
                i -= 1  # 最大数已被排序,将左子列向前遍历一个元素
            # 如果左子列最后一个数小于等于右子列最后一个数,不构成逆序对
            else:
                assist[k] = data[j]  # 将最大的数存入辅助列表
                j -= 1  # 最大数已被排序,将右子列向前遍历一个元素
            k -= 1
        # 上面一个while中还会剩下最后一个元素没有被排序,进入assist
        while i >= low:
            assist[k] = data[i]
            i -= 1
            k -= 1
        while j > mid:
            assist[k] = data[j]
            j -= 1
            k -= 1
        return left + right + count  # 返回当前左右子列计算出的逆序对数量,加上左右子列内部的逆序对数量

ESP32 驱动 SYN6288 语音合成:Arduino IDE 下实现中文数字混合文本的智能播报 本文详细介绍了如何在Arduino IDE环境下使用ESP32驱动SYN6288语音合成模块,实现中文数字混合文本的智能播报。通过硬件选型、开发环境搭建、编码转换原理、命令帧构造及串口通信实战等步骤,帮助开发者快速掌握语音播报技术。文章还提供了混合文本处理技巧和常见问题排查方法,适合智能硬件开发者参考。 阅读详情

相关推荐

STM32 移植FreeModbus详细过程

modbus是一个非常好的串口协议(当然也能用在网口上),它简洁、规范、强大。可以满足大部分的工业、嵌入式需求。 这里详细说下如何将freemodbus移植到stm32平台。我之前下载的版本是1.6,我会在我的下载链接里面加上1.6的freemodbus压缩包以及我已经移植好的stm32 for freemodbus版本。我上传的移植好的绝对没问题,经过多个板子测试。这里编译器使用的是keil5.28,单片机用的是STM32F103RCT6。 移植到VET6以及ZET6的话只需要改一下选择的芯片就好,改法:

qq_40305944的博客 8万+

剑指offer系列-面试题51. 数组中的逆序对(python)

文章目录1. 题目2. 解题思路3. 代码实现3.14. 总结5. 参考文献 1. 题目 2. 解题思路 3. 代码实现 3.1 4. 总结 5. 参考文献 [1] 剑指offer丛书 [2] 剑指Offer——名企面试官精讲典型编程题

besmarterbestronger的博客 495

2025.06.20【pacbio】|PB甲基化分析结果的统计与可视化介绍

本文介绍了PacBio甲基化数据的统计分析与可视化方法。主要内容包括:1) 分析甲基化位点分布、比例及染色体分布;2) 修饰基序(Motif)的统计与热图展示;3) 全基因组和局部区域测序深度可视化;4) 使用IGV查看单个reads修饰情况。文章提供了R代码示例,涵盖柱状图、分布图、热图等多种可视化形式,并建议了差异甲基化分析等进阶方法,帮助科研人员深入挖掘甲基化数据。

2066

【数组】 数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据...

永生只是一场幻梦 2721

windows10系统上安装最新版mysql 8.0详细步骤

windows10系统上安装最新版mysql 8.0详细步骤

glei20的博客 6715

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1712

python 数组中的逆序对

''' 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数...

WYXHAHAHA123的博客 1769

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 542

数组之数组中的逆序对

1.本题知识点    归并排序 2. 题目描述   在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 3. 思路    ① 归并排序,不会的请跳到我的基础算法博客查看。    ② 归并过程中,排序的同时记录逆序对的个数。    Java版本:...

守得云开见月明 367

2026华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,JavaScript实现。

MISAYAONE的博客 8万+

科研项目数据抓取:Python爬虫实现与分析

本文详细介绍了如何使用Python爬虫抓取科研项目的数据,涵盖了从目标数据源选择到数据存储与分析的整个过程。通过使用。

2201_76125261的博客 1710

【分治】数组中的逆序对

本文介绍了两种基于归并排序的解法来计算数组中的逆序对数量。第一种思路利用升序排序,在合并过程中统计左区间大于右区间的元素个数;第二种思路通过降序排序,统计右区间小于左区间的元素个数。两种方法均通过分治策略将时间复杂度优化至O(nlogn),避免了暴力解法的O(n²)复杂度。代码实现中展示了升序合并时的关键判断逻辑,通过临时数组辅助完成排序与统计。该问题展示了归并排序在统计特定顺序对时的巧妙应用。

lirendada的博客 1380

学Simulink——基于直流电机的建模与控制场景实例:直流电机带负载突变时的动态响应仿真

在实际应用中,直流电机经常需要应对各种工作条件的变化,例如负载突变。了解电机在这种情况下的动态响应特性对于确保系统的稳定性和可靠性至关重要。通过仿真分析,可以预测电机在不同负载条件下的表现,并优化控制系统的设计。本文将详细介绍如何使用来构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示其应用效果。本文介绍了如何使用构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示了其应用效果。

xiaoheshang_123的博客 114

数组中的逆序对(C++)

本文介绍了两种计算数组逆序对的方法:暴力解法和归并排序法。暴力解法使用两层嵌套循环,逐一比较元素,时间复杂度为O(n^2),适用于小规模数据。归并排序法利用归并排序的分治思想,结合双指针合并两个有序子数组,并在合并过程中统计逆序对,时间复杂度降为O(n log n),适用于大规模数据。具体实现中,递归地拆分数组,合并时通过比较左右子数组元素,累加逆序对数量。归并排序法高效、稳定,且满足题目对时间和空间的复杂度要求,是解决该问题的推荐方案。

m0_74091276的博客 2196

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

剑指offer47_数组中的逆序对

数组中的逆序对

君鼎的博客 823

visio安装包

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

上一篇: 中位数
下一篇: 扑克牌顺子
one_zero_one
博客等级 码龄7年 30粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值