題目描述:有一組數,對於其中任意兩個陣列,若前面乙個大於後面乙個數字,則這兩個數字組成乙個逆序對,計算給定陣列中的逆序對個數。
給定乙個int陣列a和它的大小n,請返回a中的逆序對個數。
測試樣例:
[1,2,3,4,5,6,7,0],8
返回:7
解題思路:
**思路1:**順序掃瞄整個陣列,沒掃瞄到乙個數,就比較該數與後面數的大小,如果該數小於大於後面的數,就構成逆序對。若該陣列中有n個數,則此演算法的時間複雜度為o(n^2)。
public
class
demo1
}return count;
}public
static
void
main
(string[
] args)
;int c =
count
(a,a.length)
; system.out.
println
(c);
}}
思路2:利用分治思想,採用歸併排序來解決,歸併排序的時間複雜度為o(n*log(n))。例如這個陣列,有4個數。
(1)先將陣列分成乙個乙個的子陣列,直到陣列內只有乙個數,即分成了四個陣列。
(2)再將合併,一邊排序一邊統計逆序對。合併,一邊排序一邊統計逆序對。得到兩個陣列。
(3)再將兩陣列合併,一邊排序一邊統計逆序對,得到結束。
public
class
main2
return
mergesortrecursion
(a,0
,a.length);}
public
static
intmergesortrecursion
(int
array,
int low,
int high)
int mid =
(high + low)/2
;return
mergesortrecursion
(array,low,mid)
+mergesortrecursion
(array,mid,high)
+mergecount
(array,low,mid,high);}
public
static
intmergecount
(int
array,
int low,
int mid,
int high)
else
}while
(i < mid)
while
(j < high)
//從newarray搬回到array中
for(
int t =
0;t < length;t++
)return sumreverse;
}public
static
void
main
(string[
] args)
;int r =
count
(a,7);
system.out.
println
(r);
}}
陣列中逆序對
題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...
陣列中的逆序對
來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...
陣列中的逆序對
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...