暴力是解不开的...
hard级别的题,果然得来点技巧。。。
启发:
- 采用归并的思想
- 具体怎么归并呢?
- [7, 3] 和 [2,8]. 7> 2 res+=1 ; 3 > 2 res+=1
- 归并的同时顺便排序呢?[3, 7] 和[2, 8]. 由于 3 > 2 ,所以res+=2. 因为第一个数组len = 2,最小为3>2时,所以 res+=len(第一个数组)
- 给子数组排好序
- [7, 3] 和 [2,8]. 7> 2 res+=1 ; 3 > 2 res+=1
上代码。
# -*- 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]