2013-09-07 10:50:31
面試題36:在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字構成乙個逆序對。輸入乙個陣列,求出這個陣列中逆序對的總數。
小結:最直觀的的方法是:對每個數字,測試後面的數字是否小於該數字,這種方法的時間複雜度為o(n^2);
為了改善時間效能,用歸併的方法,但這種方法組要輔助的空間o(n),見下面函式getnumberofinversepairs。
1 #include 2 #include 3using
namespace
std;
45 typedef int
datatype;
6const
int size = 100;7
8//歸併,返回逆序的個數
9int merge(datatype *array,int begin,int mid,int
end)
1026
else
2730}31
32while (index1 >=begin)
3336
37while (index2 >= (mid + 1
))38
4142 index1 =begin;
43 index2 = 0;44
45while (index1 <= end) //
將排序後的陣列複製到原陣列中
4649
50delete resarray;
51return
cntofinversepairs;52}
5354
//遞迴求逆序對的個數
55int getnumberofinversepairsrecursive(datatype *array,int begin,int
end)
5661
62int mid = begin + (end - begin) / 2;63
64int cnt1 =getnumberofinversepairsrecursive(array,begin,mid);
65int cnt2 = getnumberofinversepairsrecursive(array,mid + 1
,end);
6667
int cnt3 =merge(array,begin,mid,end);
6869
return (cnt1 + cnt2 +cnt3);70}
7172
//返回逆序對的個數
73int getnumberofinversepairs(datatype *array,int
len)
7480
81//
測試getnumberofinversepairs()
82void
testgetnumberofinversepairs()83;
85int len = 4;86
87 cout<<"
getnumberofinversepairs =
"8990
intmain()
91
劍指offer 逆序對
這道題隱含的思想是二分法和歸併排序。class solution long long inversepairscore vector data,vector int start,int end int length end start 2 long long left inversepairscor...
刷題 劍指offer之逆序對的個數
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 10 4 對於 ...
《劍指offer》 統計陣列中逆序對的個數
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 例如輸入 1,2,3,4,5,6,7,0 輸出 7 public class inversepai...