数组中的逆序对

数组中的逆序对_牛客网

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

思路:实际上是一个分治问题,不断将数组一分为二,直到数组中只有两个元素,统计逆序对个数,分别排序后进行合并,merge的时候计算合并的两个数组间的逆序对个数。类似归并排序的过程。

def InversePairs(self, data):
    # write code here
    if len(data) == 0:
        return 0

    def mergeSort(data, begin, end):
        if begin == end - 1:
            return 0
        mid = int((begin + end) / 2)
        left_count = mergeSort(data, begin, mid)
        right_count = mergeSort(data, mid, end)
        merge_count = merge(data, begin, mid, end)
        return left_count + right_count + merge_count

    def merge(data, begin, mid, end):
        i = begin
        j = mid
        count = 0
        temp = []
        while i < mid and j < end:
            if data[i] <= data[j]:
                temp.append(data[i])
                i += 1
            else:
                temp.append(data[j])
                j += 1
                count += mid - i
        while i < mid:
            temp.append(data[i])
            i += 1
        while j < end:
            temp.append(data[j])
            j += 1
        data[begin: end] = temp
        del temp
        return count

    begin = 0
    end = len(data)
    ans = mergeSort(data, begin, end)
    return ans % 1000000007
全部评论
好像超时了
点赞 回复 分享
发布于 2020-02-10 10:36
为什么我相同的思路,java实现,只通过了50% import java.util.*; public class Solution { public int InversePairs(int [] array) { if(array==null||array.length==0) return 0; int len = array.length; int ans=mergesort(array,0,len); return ans%1000000007; } int mergesort(int[] array,int begin,int end){ if(begin==end-1) return 0; int mid = ((begin+end)/2); int left = mergesort(array,begin,mid); int right = mergesort(array,mid,end); int merge_count = merge(array,begin,mid,end); return (left+right+merge_count); } int merge(int[] array,int begin,int mid,int end){ int i=begin; int j=mid; int count = 0; List<integer> list = new ArrayList<integer>(); while(i</integer></integer>
点赞 回复 分享
发布于 2020-12-09 18:32

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务