数组中的逆序对
数组中的逆序对_牛客网
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:实际上是一个分治问题,不断将数组一分为二,直到数组中只有两个元素,统计逆序对个数,分别排序后进行合并,merge的时候计算合并的两个数组间的逆序对个数。类似归并排序的过程。
def InversePairs(self, data): # write code here if len(data) == 0: return 0 def mergeSort(data, begin, end): if begin == end - 1: return 0 mid = int((begin + end) / 2) left_count = mergeSort(data, begin, mid) right_count = mergeSort(data, mid, end) merge_count = merge(data, begin, mid, end) return left_count + right_count + merge_count def merge(data, begin, mid, end): i = begin j = mid count = 0 temp = [] while i < mid and j < end: if data[i] <= data[j]: temp.append(data[i]) i += 1 else: temp.append(data[j]) j += 1 count += mid - i while i < mid: temp.append(data[i]) i += 1 while j < end: temp.append(data[j]) j += 1 data[begin: end] = temp del temp return count begin = 0 end = len(data) ans = mergeSort(data, begin, end) return ans % 1000000007