陣列中的逆序對 牛客網

2021-09-25 15:04:43 字數 1133 閱讀 7177

題意理解

給定乙個陣列,求逆序對的個數,所謂逆序對是指i < j,但是aj > ai.

問題分析

歸併排序,複雜度降到o(nlgn)

細節1:歸併過程是先排序子陣列內部,再排序子陣列之間。

細節2:排序子陣列內部,需要用到額外的空間,用輔助陣列作原始陣列,用當前陣列儲存一趟歸併的結果。

細節3:排序子陣列之間的方法是用雙指標,分三個迴圈,第乙個迴圈,兩個指標從後往前同步遍歷,直到其中乙個指標到達子陣列的開頭;第二個迴圈是遍歷第乙個陣列剩餘的元素;第三個迴圈是遍歷第二個陣列剩餘的元素。

細節4:統計逆序數的方法是,在合併兩個有序陣列時,如果前乙個陣列中元素比後乙個陣列中元素大,那麼當把這個元素排序到新陣列時,產生了逆序,逆序的個數是後乙個陣列從開頭到當前元素的長度。也就是說這個元素比這些元素都大。

其他鏈結

int inversepairs(vectordata) 

vectordata1(data); //拷貝複製乙個輔助陣列

return helper(data, data1, 0, data.size() - 1); //歸併蒐集逆序數(data1存放歸併後的結果)

}int helper(vector& data, vector& data1, int start, int end)

int mid = start + (end - start) / 2; //找到中間位置

int left = helper(data1, data, start, mid); //左半部分排序,排序結果在data中

int right = helper(data1, data, mid + 1, end); //有半部分排序,排序結果在data中

int i = mid, j = end, k = end;

long long merge = 0;

while (i >= start && j >= mid + 1)

else

k--;

}while (i >= start)

while (j >= mid + 1)

return (left + right + merge) % 1000000007;

}

牛客網 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 最直接的想法,是兩個for迴圈巢狀,求解所有的逆序對,但是複雜度太高。後參考陣列中的逆序對,利用了...

陣列中的逆序對(C 牛客網)

參考 解題思路 1 使用歸併排序,具體可參考上面那本書,注意每次交換copy和data,這樣可以避免拷貝從而節約時間 2 這裡需要注意的是,在牛客網中,下面 中的三處取模,一處都不可以少!class solution int inversepairscore vector data,vector i...

牛客網 劍指office 陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 思路 歸併排序。先將陣列分為若干個長度相等的子陣列,然後在合併子陣列的時候進行排序 並統計逆...