case通过率为50.00%(超时引起),如何优化呢?
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.count = 0
def InversePairs(self, data):
# write code here
self.merge_sort(data)
return self.count
def merge_sort(self, data):
if len(data)<=1:
return data
m = len(data)//2
left = self.merge_sort(data[:m])
right = self.merge_sort(data[m:])
return self.merge(left,right)
def merge(self,left,right):
l,r = 0,0
res = []
while l<len(left) and r<len(right):
if left[l]<=right[r]:
res.append(left[l])
l +=1
else:
res.append(right[r])
r +=1
self.count += len(left[l:])
res += left[l:]
res += right[r:]
return res
第一种方法的归并思路是两个指针从前向后扫描,每次累加都要用len()统计右半部分剩余长度;
换个思路,归并时两个指针从后向前扫描试试,这样做累加时可以直接用指针的值,会不会就不超时了呢?
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.count = 0
def InversePairs(self, data):
# write code here
self.merge_sort(data)
return self.count%1000000007
def merge_sort(self, data):
if len(data)<=1:
return data
m = len(data)//2
left = self.merge_sort(data[:m])
right = self.merge_sort(data[m:])
return self.merge(left,right)
def merge(self,left,right):
l,r = len(left)-1,len(right)-1
index = len(left)+len(right)-1
res = [0]*(index+1)
while l>=0 and r>=0:
if left[l]>right[r]:
res[index]=left[l]
l -= 1
index -= 1
self.count += r+1
else:
res[index]=right[r]
r -= 1
index -= 1
while l>=0:
res[index]=left[l]
l -=1
index -= 1
while r>=0:
res[index]=right[r]
r -=1
index -= 1
return res
虽然看起来比之前的麻烦一点点,但是竟然真的可以A了,nice!~