重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍LeetCode如何找出数组中的逆序对,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
成都创新互联公司专注于高安网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供高安营销型网站建设,高安网站制作、高安网页设计、高安网站官网定制、微信小程序开发服务,打造高安网络公司原创品牌,更为您提供高安网站排名全网营销落地服务。
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
0 <= 数组长度 <= 50000
N+(N/2)*2+(N/4)*4+...+1*N = NlogN
, 因为一共 logN
个乘积)class Solution:
def reversePairs(self, nums: List[int]) -> int:
self.res = 0
def mergesort(s, e):
if s >= e:
return
m = (s + e) >> 1
# 先排序并统计左右部分
mergesort(s, m)
mergesort(m + 1, e)
# 使用临时数组存储排序好的左右部分
# 注意这里选择逆序存储, 是因为可以利用O(1)的pop操作得到最小的元素
# 当然这里也可以使用双端队列, 这样就无需逆序了
left = nums[s:m + 1][::-1]
right = nums[m + 1:e + 1][::-1]
for i in range(s, e + 1):
if not right or left and left[-1] <= right[-1]:
# 当前左侧数字更小或者右侧数字已经用完, 此时不构成逆序对
nums[i] = left.pop()
else:
# 当前右侧数字更小, 和剩余的左侧部分都构成逆序对
self.res += len(left)
nums[i] = right.pop()
mergesort(0, len(nums) - 1)
return self.res
以上是“LeetCode如何找出数组中的逆序对”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!