0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剑指Offer(35):数组中的逆序对

电子设计 来源:电子设计 作者:电子设计 2020-12-10 22:42 次阅读

剑指Offer(35):数组中的逆序对

一、引子

这个系列是我在牛客网上刷《剑指Offer》的刷题笔记,旨在提升下自己的算法能力。
查看完整的剑指Offer算法题解析请点击CSDN和github链接:
剑指Offer完整习题解析CSDN地址
github地址

二、题目

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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

1、思路

首先我们先明白题目的意思,比如一个数组{7,5,6,4},它的逆序对总共有五对,{7,5},{7,6},{7,4},{5,4},{6,4} 只要是前面比后面大就组成一个逆序对。

看到这个题目,我们的第一反应是顺序扫描整个数组。每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成了一个逆序对。假设数组中含有n个数字。由于每个数字都要和O(n)这个数字比较,因此这个算法的时间复杂度为O(n^2)。

现在用上面说的这种方式是一种时间复杂度比较高的一种,我们换一种思路,采用归并排序的方法。

先把数组分解成两个长度为2的子数组,再把这两个子数组分解成两个长度为1的子数组。接下来一边合并相邻的子数组,一边统计逆序对的数目。在第一对长度为1的子数组{7}、{5}中7>5,因此(7,5)组成一个逆序对。同样在第二对长度为1的子数组{6},{4}中也有逆序对(6,4),由于已经统计了这两对子数组内部的逆序对,因此需要把这两对子数组进行排序,避免在之后的统计过程中重复统计。

逆序对的总数 = 左边数组中的逆序对的数量 + 右边数组中逆序对的数量 + 左右结合成新的顺序数组时中出现的逆序对的数量

2、编程实现

python

代码实现方案:

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        if not data:
            return 0
        temp = [i for i in data]
        return self.mergeSort(temp, data, 0, len(data)-1) % 1000000007
    def mergeSort(self, temp, data, low, high):
        if low >= high:
            temp[low] = data[low]
            return 0
        mid = (low + high) / 2
        left = self.mergeSort(data, temp, low, mid)
        right = self.mergeSort(data, temp, mid+1, high)
        count = 0
        i = low
        j = mid+1
        index = low
        while i <= mid and j <= high:
            if data[i] <= data[j]:
                temp[index] = data[i]
                i += 1
            else:
                temp[index] = data[j]
                count += mid-i+1
                j += 1
            index += 1
        while i <= mid:
            temp[index] = data[i]
            i += 1
            index += 1
        while j <= high:
            temp[index] = data[j]
            j += 1
            index += 1
        return count + left + right

分享技术,乐享生活:我们的公众号计算机视觉这件小事每周推送“AI”系列资讯类文章,欢迎您的关注!

本文由博客一文多发平台 OpenWrite 发布!

审核编辑 黄昊宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人工智能
    +关注

    关注

    1791

    文章

    46967

    浏览量

    237837
  • 机器学习
    +关注

    关注

    66

    文章

    8387

    浏览量

    132481
  • 数组
    +关注

    关注

    1

    文章

    416

    浏览量

    25923
  • 深度学习
    +关注

    关注

    73

    文章

    5495

    浏览量

    121047
收藏 人收藏

    评论

    相关推荐

    offer 06.从头到尾打印链表

    编程语言
    jf_40173672
    发布于 :2022年07月25日 09:43:38

    数组的0怎么去掉

    本帖最后由 fqhyf 于 2015-5-14 18:35 编辑 数组的0怎么去掉
    发表于 05-14 18:32

    动态规划与贪婪法题的背包问题总结

    【LeetCode & offer刷题】动态规划与贪婪法题16:背包问题总结
    发表于 06-09 16:44

    聚辰半导体通用MCU应用

    聚辰半导体通用MCU应用 聚辰半导体有限公司的前身是美国ISSI(Integrated Silicon Solution)全资控股子公司芯成半导体(上海)有限
    发表于 03-19 08:52 1143次阅读

    C语言教程之逆序存放数据

    C语言教程之逆序存放数据,很好的C语言资料,快来学习吧。
    发表于 04-25 15:03 0次下载

    逆序算法程序

    逆序算法程序,其实也不是那么难,就分享一下,希望大家别介意
    发表于 05-19 14:31 8次下载

    介绍了数组和簇数据类型以及创建和使用数组和簇的方法

    数组索引从0开始。 也就是说,如果一维(1D)数组包含n个元素,那么索引范围就是0~n – 1,其中索引0数组的第一个元素,索引n
    发表于 11-16 18:13 1.1w次阅读
    介绍了<b class='flag-5'>数组</b>和簇数据类型以及创建和使用<b class='flag-5'>数组</b>和簇的方法

    java数组的三种定义方式_java数组的定义及使用方法(推荐)

    java数组是一种很常用的工具,本文将介绍来java数组的三种定义方式以及java数组
    发表于 01-29 09:53 3.2w次阅读

    Offer(37):数字在排序数组中出现的次数

    搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法、机器学习干货 csdn:[链接] github:[链接]
    的头像 发表于 12-10 22:40 216次阅读

    如何对一维数组做maxpooling

    最近在offer里看到一道算法题很有意思,分享给大家。
    的头像 发表于 04-11 08:41 2862次阅读

    C 语言数组的基本结构

    的元素 求数组中元素的最短距离 求两个有序数组的共同元素 求三个数组的共同元素 找出数组唯一的重复元素 找出出现奇数次的元素 求
    的头像 发表于 06-22 10:56 583次阅读

    数组的定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一
    的头像 发表于 10-09 09:39 1868次阅读

    labview怎么查数组相同元素的个数

    要查找LabVIEW数组相同元素的个数,可以使用以下步骤: 创建一个包含要查找的数值的数组。这可以通过手动输入数组元素或从文件/其他数据
    的头像 发表于 12-28 16:42 3341次阅读

    PHP数组的使用方法!

    PHP数组的使用方法! PHP是一种广泛使用的网络编程语言,它的数组功能非常强大且灵活。数组是一种数据结构,它允许我们在单个变量存储多个
    的头像 发表于 01-12 15:11 519次阅读

    数组和链表在内存的区别 数组和链表的优缺点

    数组和链表在内存的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存的存储方式以及优缺点方面存在一些
    的头像 发表于 02-21 11:30 952次阅读