剑客-35 逆序对

暴力是解不开的...

hard级别的题,果然得来点技巧。。。

启发:

  1. 采用归并的思想
  2.  具体怎么归并呢?
    1. [7, 3] 和 [2,8].  7> 2 res+=1 ;  3 > 2 res+=1
      1. 归并的同时顺便排序呢?[3, 7] 和[2, 8].  由于 3 > 2 ,所以res+=2. 因为第一个数组len = 2,最小为3>2时,所以 res+=len(第一个数组)
      2. 给子数组排好序

上代码。

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here 
        # 暴力法解决不了   二分归并法
        self.res = 0
        self.splitArray(data, 0, len(data)-1)
        return self.res
    
    def splitArray(self, data, start, end):
        if start>=end:
            return
        
        mid = (start+end)//2
        self.splitArray(data, start, mid)
        self.splitArray(data, mid+1, end)
        self.merge(data, start, end, mid)
        
    def merge(self, data, start, end, mid):
        temp = []
        # 两个指针很重要 
        p1 = start
        p2 = mid+1
        
        while p1<=mid and p2<=end:
            if data[p1]<=data[p2]:
                temp.append(data[p1])
                p1+=1
            else:
                temp.append(data[p2])
                p2+=1
                # 启发上面有解释。
                self.res = (self.res + mid - p1 + 1) % 1000000007
        # 复制余下的有序数组
        while p1<=mid:
            temp.append(data[p1])
            p1+=1
        while p2<=end:
            temp.append(data[p2])
            p2+=1
        
        #把排好序的临时数组填充到原数组中
        for j in range(len(temp)):
            data[start+j] = temp[j]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值