题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
解题思路:
如果直接遍历数组,时间复杂度为o(n**2),思路太简单肯定是不行的。
所以可以使用归并排序,只用在合并数组的时候倒着合并就可以了。
比如对于数组a,b(已经是排序过了的)。两个指针分别指向两个子数组的末尾,并每次比较两个指针指向的数字。如果第一个数组的指针指向的值(x)大于第二个数组指针指向的值(y),那么说么对于第一个数组的x来说,第二个数组y及之前的数都是逆序,计算出个数即可。取出x放入临时数组,然后x的指针向前移动一位,继续比较。如果y比x大,那么对于y来说,第一个数组中在x和x之前的数都不可能与y逆序,所以取出y放入临时数组,y指针向前移动一位。
代码如下:
class Solution:
def InversePairs(self, data):
# write code here
self.temp = [i for i in data]
cum = self.mergesort(data,0, len(data) -1)
print(data)
return cum
def mergesort(self,data,left,right):
if left < right:
mid = (left + right) //2
cum1 = self.mergesort(data,left, mid)
cum2 = self.mergesort(data,mid+1,right)
cum3 = self.mergeAndCompute(data,left,mid,right)
return cum1 + cum2 + cum3
return 0
def mergeAndCompute(self,data,left,mid,right):
i,j,m,n = left,mid,mid+1,right
x = right
cum = 0
while i <=j and m <=n:
if data[j] < data[n]:
self.temp[x] = data[n]
x-=1
n-=1
else:
self.temp[x] = data[j]
cum+= (n - m + 1)
x-=1
j-=1
while i <=j:
self.temp[x] = data[j]
x-=1
j-=1
while m<=n:
self.temp[x] = data[n]
x-=1
n-=1
for i in range(left, right+1):
data[i] = self.temp[i]
return cum
注:这道题牛客网用python是存在bug的,运行始终超时,但是!!即使你直接返回一个实数,它依旧超时!!