題意理解
給定乙個陣列,求逆序對的個數,所謂逆序對是指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 思路 歸併排序。先將陣列分為若干個長度相等的子陣列,然後在合併子陣列的時候進行排序 並統計逆...