背景
找数组中有多少对逆序的数列。
解题思路与题解
直接写归并排序的代码。归并排序的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn), 然后在每次当右边小于左边时进行统计逆序对的数量(归并排序并不难写,但是这里如果考虑出现问题,可能会有很大的bug)。 其次,在写这道题时,使用归并排序,时间超时,当每次返回时,不返回数组,则时间不超时。核心为,在归并排序的基础上加:
self.res = self.res + (len(larr)-i) #统计逆序对的次数
超时代码
class Solution:
def __init__(self):
self.res = 0
def reversePairs(self, nums):
def reversePairsO(l,r):
if l>r:
return []
if l == r:
return [nums[l]]
tres = []
mid = (l+r)//2
larr = reversePairsO(l, mid)
rarr = reversePairsO(mid+1, r)
i=0
j=0
print("larr",larr)
print("rarr",rarr)
while i<len(larr) and j<len(rarr):
if larr[i]<=rarr[j]:
tres.append(larr[i])
i += 1
else:
self.res = self.res + (len(larr)-i)
tres.append(rarr[j])
j += 1
while i<len(larr):
tres.append(larr[i])
i += 1
while j<len(rarr):
tres.append(rarr[j])
j += 1
return tres
rres = reversePairsO(0,len(nums)-1)
return self.res
# nums = [1,3,5,2,4,7]
# sol = Solution()
# sol.reversePairs(nums)
不超时代码
class Solution:
def __init__(self):
self.res = 0
def reversePairs(self, nums):
def reversePairsO(l,r):
if l>r or l>=len(nums):
return []
if l == r:
return [nums[l]]
tres = []
mid = (l+r)//2
# mid = l + (r-l)//2
reversePairsO(l, mid)
reversePairsO(mid+1, r)
i=l
j=mid+1
while i<=mid and j<=r:
if nums[i]<=nums[j]:
tres.append(nums[i])
i += 1
else:
self.res = self.res + (mid+1-i)
tres.append(nums[j])
j += 1
while i<=mid:
tres.append(nums[i])
i += 1
while j<=r:
tres.append(nums[j])
j += 1
nums[l:r+1] = tres
rres = reversePairsO(0,len(nums)-1)
return self.res