在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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 #include2view codeusing
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 }
圖)完整**)
劍指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...