class Solution:
def reversePairs(self, nums: List[int]) -> int:
# 时间复杂度:归并排序 O(NlogN)
# 空间复杂度 O(N)
def mergeSort(nums,left,mid,right):
# 整合的数组
temp = [0] * (right-left+1)
# 记录更新temp数组的下标
index = 0
# 两段的开头
temp1 = left
temp2 = mid + 1
while temp1<= mid and temp2<=right:
# 遍历不能超过边界
if nums[temp1]<=nums[temp2]:
temp[index] = nums[temp1]
index += 1
temp1 += 1
else:
# 可以用来统计逆序对的个数
self.count += (mid-temp1+1)
temp[index] = nums[temp2]
index += 1
temp2 += 1
# 把左边剩余的数移入数组
if temp1<=mid:
temp[index:] = nums[temp1:temp1+(mid-temp1+1)]
if temp2<=right:
temp[index:] = nums[temp2:temp2+(right-temp2+1)]
nums[left:left+(right-left+1)]=temp[:]
"""
# 不使用切片操作,一个个存
while temp1<=mid:
temp[index] = nums[temp1]
index += 1
temp1 += 1
while temp2 <= right:
temp[index] = nums[temp2]
index += 1
temp2 += 1
# 把新数组中的数字覆盖原数组
for k in range(len(temp)):
nums[left + k] = temp[k]
"""
def merge(nums,left,right):
mid = left + (right-left)//2
if left < right:
merge(nums,left,mid)
merge(nums,mid+1,right)
mergeSort(nums,left,mid,right)
self.count = 0
merge(nums,0,len(nums)-1)
return self.count
每日一道Leetcode - 剑指 Offer 51. 数组中的逆序对 【归并排序】
最新推荐文章于 2024-06-14 12:00:00 发布