美文网首页剑指offer- python实现
面试题51:数组中的逆序对(slow)

面试题51:数组中的逆序对(slow)

作者: 不会编程的程序猿甲 | 来源:发表于2020-03-31 14:52 被阅读0次

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

思路:
这道题可以在归并排序的基础上作答,具体如下:

51 数组中的逆序对(归并排序法).png

代码实现:

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        if not data or len(data)<=0:
            return 0
        #一般情况
        #初始化参数
        length = len(data)
        copy = [0]*length
        #辅助元素赋值
        for i in range(length):
            copy[i] = data[i]
        result = self.Core(data,copy,0,length-1)
        return result % 1000000007
    #归并排序核心函数
    def Core(self, data, copy, start, end):
        #递归结束条件
        if start == end:
            copy[start] = data[start]
            return 0
        leng = (end - start) // 2
        #递归进行排序
        left = self.Core(copy,data,start,start + leng)  #改变copy的值
        right = self.Core(copy,data,start+leng+1,end)

        count = 0
        i = leng + start
        j = end
        CopyIndex = end
        #进行归并
        while(i>=start and j>=start+leng+1):
            if data[i]> data[j]:
                copy[CopyIndex] = data[i]
                CopyIndex-=1
                i-=1
                count +=j-leng-start   #因为按顺序,所以第二个数组前面的都会和这个数字成为逆序对
            else:
                copy[CopyIndex] =data[j]
                CopyIndex-=1
                j-=1
        while i>= start:
            copy[CopyIndex] = data[i]
            CopyIndex-=1
            i-=1
        while j>=leng+1+start:
            copy[CopyIndex] = data[j]
            CopyIndex-=1
            j-=1
        return left + count + right

提交结果:(慢)


image.png

相关文章

  • 面试题51:数组中的逆序对(slow)

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

  • LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-...

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 每日leetcode 面试题51 2020-03-21

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 用的是mergesort的思路,对于一个数组,我们将其分为前后两列,我们可以先分别统...

  • 面试题51:数组中的逆序对

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

  • 剑指offer第二版-51.数组中的逆序对

    本系列导航:剑指offer(第二版)java实现导航帖 面试题51:数组中的逆序对 题目要求:如果前面一个数字大于...

  • 面试题51:数组的逆序对

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

  • 面试题51_数组中的逆序对

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

  • 面试题51. 数组中的逆序对

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

网友评论

    本文标题:面试题51:数组中的逆序对(slow)

    本文链接:https://www.haomeiwen.com/subject/yamwuhtx.html