【剑指offer】35 数组中的逆序数对

题目

在这里插入图片描述

分析

方法一(超时):暴力解法。每次找到最小值和其位置,逆序数+=其下标,然后剔除最小值。
方法二:归并排序。[87654321],分成两个数组[8765]和[4321]每个数组的内部的逆序数对都是4,并排好序 [5678],[1234].然后合并他们得到[56781234]的逆序数对并排序。
最终的逆序数对就是最大的两个区间合并起来算出的逆序数对。

python代码

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.cnt = 0
        
    def merge(self,data,start,mid,end):
        temp = []
        i = start
        j = mid +1
        while i<=mid and j<=end:
            if data[i]<=data[j]:
                temp.append(data[i])
                i+=1
            else:
                self.cnt+=mid-i+1
                temp.append(data[j])
                j+=1
        if i<=mid:
            while i<=mid:
                temp.append(data[i])
                i+=1
        if j<=end:
            while j<=end:
                temp.append(data[j])
                j+=1
        for n in range(len(temp)):
            data[start+n] = temp[n]
    def mergeSort(self,data,start,end):
        if start>=end:
            return 
        mid = (start+end)>>1
        self.mergeSort(data, start, mid)
        self.mergeSort(data, mid+1, end)
        self.merge(data, start, mid, end)
        
    def InversePairs(self, data):
        # write code here
        if not data: return 0
        if len(data)<2: return 0
        self.mergeSort(data, 0, len(data)-1)
        return self.cnt%1000000007
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值