劍指51 陣列中的逆序對

2021-10-09 11:14:07 字數 991 閱讀 7593

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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 陣列中的逆序對

這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...