題目描述:
在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)?。輸入一個(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對(duì)1000000007取模的結(jié)果輸出。 即輸出P%1000000007
解題思路:
一開始一頭霧水,后面想到了使用歸并排序的思想,其實(shí)有多少個(gè)逆序?qū)?,就是歸并排序的時(shí)候,后面的數(shù)要超越前面多少個(gè),嗯,好像不是很好說,要不然直接看代碼吧。還要注意,題目當(dāng)中說要輸出取模的結(jié)果,這說明數(shù)據(jù)可能非常大,所以如果只是單純的在最后取模的話可能還是無法避免數(shù)據(jù)太大的影響,所以我們?cè)诿看胃耤ount的時(shí)候就對(duì)其進(jìn)行取模運(yùn)算。
剛好又練習(xí)了一遍歸并排序,記錄一下
public class Solution { int count; public int InversePairs(int [] array) { count = 0; if(array != null){ divPairs(array, 0, array.length-1); } return count%1000000007; } public void divPairs(int[] array, int start, int end){ if(start >= end) return; int mid = (start + end)>>1; divPairs(array, start, mid); divPairs(array, mid+1, end); mergePairs(array, start, mid, end); } public void mergePairs(int[] array, int start, int mid, int end){ int i = start, j = mid+1, k = 0; int[] temp = new int[end-start+1]; while(i <= mid && j <= end){ if(array[i] <= array[j]){ temp[k++] = array[i++]; }else{ temp[k++] = array[j++]; count += mid - i + 1; count %= 1000000007; } } while(i <= mid){ temp[k++] = array[i++]; } while(j <= end){ temp[k++] = array[j++]; } for(int x = 0; x < temp.length; x++){ array[start+x] = temp[x]; } }}以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選