題目描述
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。
輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
示例:
輸入
1,2
,3,4
,5,6
,7,0
輸出
7
先來一種錯誤的示範:(錯誤原因是執行超時,只通過了50%)
#include
#include
#include
#include
using
namespace std;
class
solution3
}return sum %
1000000007;}
};intmain()
;int num;
solution3 s3;
num = s3.
inversepairs
(data)
; cout << num << endl;
}
先看一下結果是正確的,下面是測試報告
接下來是官方給的正確的做法,主要使用了遞迴歸併排序,時間和記憶體確實減少了不少,從來沒有這麼真切地感受到演算法的差距。
#include
#include
#include
using
namespace std;
class
solution4
else
}//沒比較完剩餘的一邊直接加進去
while
(i <= m)
while
(j <= r)
//有序的放回去
for(
int t =
0,u=l; u <= r;u++
, t++)}
void
mergesort
(vector<
int>
&arr,
int l,
int h,
int&result)
intinversepairs
(vector<
int> data)};
intmain()
;//測試用例,用例太少不會感到壓力
vector<
int> data =
;int num;
solution4 s4;
num = s4.
inversepairs
(data)
; cout << num << endl;
return0;
}
陣列中的逆序對(歸併排序)
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。在歸併排序的一次merge中,r j 1 法一 統計i的逆序數 int merge int a,int p,int q,int r int n1 q p 1,n2 r q in...
陣列中的逆序對(歸併排序)
題目 陣列中的逆序對 思路 典型的歸併排序 很好的題目 這是乙個歸併排序的合併過程,主要考慮合併兩個有序序列時,計算逆序對的個數!對於兩個公升序序列,設定兩個下標 前下標和後下標 初始化為前序列第乙個數字的下標和後序列第乙個數字的下標。如果前下標對應的值大於後下標對應的值,則有 前序列剩下的長度 個...
陣列中的逆序對(歸併排序)
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...