题目
分析
方法一(超时):暴力解法。每次找到最小值和其位置,逆序数+=其下标,然后剔除最小值。
方法二:归并排序。[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