剑指 Offer 51. 数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 困难
方法:归并排序 时间复杂度O(nlogn) 空间复杂度O(n) 归并排序就是按照二分法将数组划分为若干个小数组,回溯的时候按照既定顺序两两合并,这样可以在合并的时候判断两数大小,确定逆序对的个数

def reversePairs(nums): """ :type nums: List[int] :rtype: int """ def merge_sort(l,r): if l >= r: return 0 mid = l + ((r - l) >> 1) res = merge_sort(l, mid) + merge_sort(mid + 1,r) tmp[l:r+1] = nums[l:r+1] i,j = l,mid + 1 for k in range(l,r + 1): if i == mid + 1: nums[j] = tmp[j] j += 1 elif j == r + 1 or tmp[i] <= tmp[j]: nums[k] = tmp[i] i += 1 else: nums[k] = tmp[j] j += 1 res += mid - i + 1 return res tmp = [0] * len(nums) return merge_sort(0,len(nums) - 1)

浙公网安备 33010602011771号