劍指Offer 35陣列中的逆序對

2022-05-17 18:14:48 字數 1847 閱讀 4164

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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
思路:

類似於megersort

先統計子陣列內部的逆序對的數目,然後再統計2個相鄰子陣列之間的逆序對的數目,在統計的過程中,還需要對陣列排序,

排序可以避免重複統計。

37 \ 26 合併的時候,

3 > 2, 所以2的逆序對有2個(32,72)

37與6合併的時候,逆序對有1個(76)

class

solution

else

}while(l_start<=l_end)

while(r_start<=r_end)

//sort

for(int k = left; k<= right;k++)

return

cnt;

}int msort(vector&nums,vector&aux,int left, int

right)

int reversepairs(vector&nums)

};

1

public

class

solution

9private

int fun(int a,int aux,int lo,int

hi)26

else

27 aux[ai--]=a[j--];28}

2930

while(i>=lo)

31 aux[ai--]=a[i--];

32while(j>=mid+1)

33 aux[ai--] =a[j--];

3435

//更新陣列

36for(int k = lo;k<=hi;k++)

37 a[k] =aux[k];

3839

return (left+right+count)%1000000007;40}

41 }

c++ 20180725

1

class

solution

10long

long inversepairscore(std::vector &data,std::vector ©,int lo,int

hi)27

else30}

31while(i>=lo)

32 copy[k--] = data[i--];

33while(j>=mid+1

)34 copy[k--] = data[j--];

35for(int m = lo;m<=hi;m++)

36 data[m] =copy[m];

37return (left+right+cnt)%1000000007;38

}39 };

劍指offer35 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...

劍指Offer(35) 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。例如輸入,輸出5對。分治思想,採用歸併排序的思路來處理。在合併兩個有序序列時,同時計算逆序對數。對...

劍指Offer 35 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...