劍指offer陣列中的逆序對數

2021-10-06 11:41:23 字數 1086 閱讀 9547

今天的第二道題目,因為自己第一次做類似的題目,能力有限,參考了題解中優秀的解法,上題:

題目描述

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

輸入描述:

題目保證輸入的陣列中沒有的相同的數字

資料範圍:

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

示例1

輸入1,2,3,4,5,6,7,0輸出7

分析:這道題需要求解逆序對數,其實很好理解,就是在排序過程中進行進行交換的次數,因為之前面的數字大,才會用到交換,也就是逆序對。

排序有很多方法:冒泡、歸併等等,我先想到的就是冒泡,沒想到歸併思想。

方法一:冒泡法

**:public class solution }}

return count%1000000007;

}}**是不是很簡單,但是只執行通過了50%,其實就是上面資料中的第一種型別,所以氣泡排序求逆序對數是不可行的,那我們就用用歸併。

方法二:歸併

歸併是先分再治,即先將資料進行形如二叉樹的分解,在進行合併,在合併的過程中需要兩兩比較,這裡即可以產生逆序對。

public class solution

private void mergeone(int array, int start, int mid, int end)

}while(i<= mid)

temp[k++] = array[i++];

while(j<=end)

temp[k++] = array[j++];

for(int l=0; l}

public int inversepairs(int array)

}牛客運行通過

執行記憶體:51220kb

這主要是考察歸併排序的思想,如果不是很清楚的網上搜尋一下歸併排序的思想。

歡迎各位互相交流~~

劍指offer 陣列中的逆序對數目

問題 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 對於逆序對的問題,首先最容易想到的就是暴力窮舉的方法。然而在題目中n的取值非常大,遍歷的時間...

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...

劍指offer 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...