在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。
即輸出p%1000000007。
示例:
輸入:1,2,3,4,5,6,7,0
輸出:7
逆序對的存在表明數字沒有按照順序排列,因此進行排序的時候將交換次數累計下來即可得到逆序對的數量。但這要求排序演算法是穩定,即不會造成多餘的交換。
三種簡單演算法:冒泡、簡單選擇、直接插入都是穩定的排序演算法,但它們的時間複雜度都是o(n^2)的,如果要求較低可以使用該方法。
高階演算法中,常用的只有歸併排序是穩定的。
氣泡排序求解**:
public
class
solution}}
return
(int
)(cnt%
1000000007);
}private
void
swap
(int
array,
int i,
int j)
}
歸併排序求解**:
public
class
solution
private
void
mergesort
(int
nums,
int l,
int h)
private
void
merge
(int
nums,
int l,
int m,
int h)
k++;}
for(k=l;k<=h;k++
) nums[k]
= tmp[k];}
}
圖的話等熟練了再補啦。 劍指筆記 51 陣列中的逆序對
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p 思路 以下是劍指中的思路。最容易想到是就是順序掃瞄整個陣列,每掃瞄到乙個數字,逐個比較這個數字和它後面數字的大小。這種思路的時間複雜度是 歸併排序的時間複雜度是o nl...
劍指Offer 51 陣列中的逆序對
在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。樣例輸入 1,2,3,4,5,6,0 輸出 6 class solution object definversepairs self,nums type nums list in...
劍指offer 51 陣列中的逆序對
這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...