在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解題思路:最樸素解法,暴力解法,遍歷所有的資料對,前者大於後者就是一組逆序對示例 1:
輸入: [7,5,6,4]
輸出: 5
限制:0 <= 陣列長度 <= 50000
class
solution
return res;
}}
由於時間複雜度o(n^2)的,超出時間限制。
陣列的長度限制是50000,對於乙個o(n^2)的時間複雜度,資料規模達到25億大小。所以使用歸併排序來解決,逆序對問題也是歸併排序的應用。
class
solution
private
void
sort
(int
arr,
int l,
int r,
int[
] temp)
private
void
merge
(int
arr,
int l,
int mid,
int r,
int[
] temp)
else
if(j > r)
else
if(temp[i]
<= temp[j]
)else}}
public
static
void
main
(string[
] args)
;int n =
newsolution()
.reversepairs
(arr)
; system.out.
println
(n);
}}
改進**正規化,不設定res成員變數,直接用函式返回值將結果返回,使用函式式程式設計,減少需要維護的狀態。
class
solution
private
intsort
(int
arr,
int l,
int r,
int[
] temp)
private
intmerge
(int
arr,
int l,
int mid,
int r,
int[
] temp)
else
if(j > r)
else
if(temp[i]
<= temp[j]
)else
}return res;
}public
static
void
main
(string[
] args)
;int n =
newsolution()
.reversepairs
(arr)
; system.out.
println
(n);
}}
提交結果![](https://pic.w3help.cc/a26/06d11e99bbc795fb8ad0d8d25b59b.jpeg)
劍指Offer 51 陣列中的逆序對
在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。樣例輸入 1,2,3,4,5,6,0 輸出 6 class solution object definversepairs self,nums type nums list in...
劍指offer 51 陣列中的逆序對
這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...
劍指offer51 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 10 4對於...