这篇文章主要介绍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如何找出数组中的逆序对”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。