牛客網劍指offer第35題 陣列中的逆序對

2022-05-02 13:48:12 字數 997 閱讀 8890

題目:

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

剛看到這個題目的時候,我的第一直覺是,不能對陣列排序,因為排序打亂了數字的相對順序,無法求解逆序對。於是採用了遍歷的方法,很明顯,時間複雜度位o(n2),導致最周直接因為執行時間太長沒通過。因此,這道題目中一定存在比較巧妙的方法:而其方法就是:因為歸併排序中有一步:將兩個有序陣列合併成乙個有序陣列,在這個遞迴合併的過程中,我們可以求得逆序對。

可以參考下面的**:

具體思路如下:

在合併的過程中是將兩個相鄰並且有序的序列合併成乙個有序序列,如以下兩個有序序列

seq1:3  4  5

seq2:2  6  8  9

合併成乙個有序序:

seq:2  3  4  5  6  8  9

對於序列seq1中的某個數a[i],序列seq2中的某個數a[j],如果a[i]a[j],那麼逆序數為seq1中a[i]後邊元素的個數(包括a[i]),即len1-i+1,

這樣累加每次遞迴過程的逆序數,在完成整個遞迴過程之後,最後的累加和就是逆序的總數

完整**如下:

1

class

solution 19}

20while((i > mid) && (j <=r))

2124

while((j > r) && (i <=mid))

2528

for(int i = 0;i 1;i++)

29 data[l+i]= tmp[i]; //

這一步對於data的索引極其容易出錯30}

31void mergesort(vector& data,int l,int

r)32

40int inversepairs(vectordata)

44 };

第35天 演算法(牛客網劍指offer2)

1.jz13 機械人的運動範圍 int ans 0 public int movingcount int threshold,int rows,int cols public void process boolean dp,int threshold,int i,int j,int rows,int...

牛客網 劍指Offer(66題)

1 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 直接遍歷二維陣列 public class solution find 8,a public st...

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...