劍指offer 求逆序對的個數

2022-04-10 01:01:16 字數 1579 閱讀 7705

2013-09-07 10:50:31

面試題36:在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字構成乙個逆序對。輸入乙個陣列,求出這個陣列中逆序對的總數。

小結:最直觀的的方法是:對每個數字,測試後面的數字是否小於該數字,這種方法的時間複雜度為o(n^2);

為了改善時間效能,用歸併的方法,但這種方法組要輔助的空間o(n),見下面函式getnumberofinversepairs。

1 #include 2 #include 3

using

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...