在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
輸入: [7,5,6,4]
輸出: 5
class
solution
:def
__init__
(self)
: self.count =
0def
reversepairs
(self, nums: list[
int])-
>
int:
self.mergesort(nums)
return self.count
defmergesort
(self, lists):if
len(lists)
<=1:
return lists
num =
int(
len(lists)//2
) left = self.mergesort(lists[
:num]
) right = self.mergesort(lists[num:])
r, l =0,
0 result =
while l <
len(left)
and r <
len(right)
:if left[l]
<= right[r]:)
l +=
1else:)
r +=
1 self.count +=
len(left)
- l result += right[r:
] result += left[l:
]return result
歸併排序應用之求陣列中的逆序數
一,問題描述 給定乙個陣列,求解該陣列中有多少組逆序對。比如 7,5,6,4 一共有五對逆序對。分別是 7,6 7,5 7,4 6,4 5,4 二,演算法分析 有兩種方法來求解逆序對 的數目。一種是,對陣列中的每個元素,都與它後面的元素進行比較,若後面的元素比它小,則找到乙個逆序對。這樣,第乙個元素...
歸併排序求逆序對數
參考部落格 歸併排序求逆序對數 include include include includeusing namespace std 歸併排序是借助乙個輔助陣列來進行排序 int ans 0 void merge sort int a,int l,int r,int t a是原陣列,t是輔助陣列 i...
歸併排序求解逆序對數
定義 逆序對就是對於ia j 這樣的數對在序列中的個數。求解方法 歸併排序是採用分治的思想劃分數列,然後將兩路有序的數列合併。通過劃分和合併的遞迴呼叫來完成排序。在合併的過程中,兩個數列中的元素的相對位置不會發生改變 這裡只是前後關係 而且如果後乙個數列b中某個元素b在需要先放入 優先於前乙個數列a...