劍指offer35 陣列中的逆序對

2022-05-24 19:03:10 字數 2010 閱讀 1131

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007

利用歸併排序的思想,先把陣列分隔成子陣列,先統計出子陣列內部的逆序對的數目,然後再統計出兩個相鄰子陣列之間的逆序對的數目。注意在合併兩個已排序的子陣列後,要更新陣列。o(n*log(n))。

//歸併

13void inversepairscore(vector &data, vector ©, int start, int end, int &count)

17int mid = (start + end) /2;18

inversepairscore(data,copy,start,mid,count);

19 inversepairscore(data,copy,mid+1

,end,count);

2021

int copyindex = end; //

將較大數字從後往前複製到輔助陣列

22int i = mid; //

前半段最後乙個元素下標

23int j = end; //

後半段最後乙個元素下標

24while (i>=start && j>=mid+1

) else32}

3334

while (i>=start)

35 copy[copyindex--] = data[i--];

3637

while (j>=mid+1

)38 copy[copyindex--] = data[j--];

3940

for (int k = start; k <= end; ++k)

41 data[k] =copy[k];

4243

}44 };

view code

1 #include2

using

namespace

std;3//

陣列中的逆序對

4long

long getmergepairsbetween(int* arr,int* copy,int start,int mid,int

end)522

else

2329}30

while(final1 >= start)//

第乙個陣列的元素沒有處理完

3134

while(final2 >= mid + 1)//

第乙個陣列的元素沒有處理完

3538

for(int i = end; i > index;i--)

39 arr[i] =copy[i];

40return

count;41}

42long

long getmergepairs(int* arr,int* copy,int start,int

end)

4352

return

ret;53}

54long

long gettotalpairs(int arr,int

n)55

63int

main()64;

66int ret = gettotalpairs(arr,sizeof(arr)/sizeof(arr[0

]));

67 cout

68 system("

pause");

69return0;

70 }

view code

圖)完整**)

劍指offer35 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...

劍指Offer(35) 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。例如輸入,輸出5對。分治思想,採用歸併排序的思路來處理。在合併兩個有序序列時,同時計算逆序對數。對...

劍指Offer 35 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...