1. 程式人生 > 其它 >計算陣列中的逆序對

計算陣列中的逆序對

描述

在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P mod 1000000007
資料範圍:  對於 50\%50% 的資料, size\leq 10^4size104
對於 100\%100% 的資料, size\leq 10^5size105
陣列中所有數字的值滿足 0 \le val \le 10000000val1000000

要求:空間複雜度 O(n)O(n),時間複雜度 O(nlogn)O(nlogn)

輸入描述:

題目保證輸入的陣列中沒有的相同的數字
  • 思路:採用歸併排序演算法
class ListNode:
    
def __init__(self, x): self.val = x self.next = None class Solution: def InversePairs(self, data: List[int]) -> int: _, res = self.merge_sort(0, len(data) - 1, data) print(len(_), _) return res % 1000000007 def merge_sort(self, start, end, data):
if start > end: return [], 0 if start == end: return [data[start]], 0 mid = (start + end) >> 1 left_d, l_c = self.merge_sort(start, mid, data) right_d, r_c = self.merge_sort(mid + 1, end, data) c = l_c + r_c res = [] l_idx
= r_idx = 0 while True: if l_idx >= len(left_d): res.extend(right_d[r_idx:]) break if r_idx >= len(right_d): res.extend(left_d[l_idx:]) break if left_d[l_idx] <= right_d[r_idx]: res.append(left_d[l_idx]) l_idx += 1 else: res.append(right_d[r_idx]) c += len(left_d) - l_idx r_idx += 1 return res, c def list_to_list_node(l): head = ListNode(None) temp = head for i in l: temp.next = ListNode(i) temp = temp.next return head.next def list_node_to_list(head): temp = head res = [] while temp: res.append(temp.val) temp = temp.next return res if __name__ == '__main__': a = [1,2,3,4,5,6,7,0,9] print(len(a)) print(Solution().InversePairs(a))