面試題 陣列中的逆序對

2021-08-15 07:54:16 字數 972 閱讀 6541

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對總數。例如嗎,在陣列中,一共存在5個逆序對,分別是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。

思路:作者給出的是基於歸併排序的一種演算法。那麼必然比暴力的o(n^2)的好。

**如下:

int inversepairs(int* data,int length)

if(data==nullptr||length<0)

return 0;

int* copy=new int[length];

for(int i=0;i

int count=inversepairscore(data,copy,0,length-1);

delete copy;

int inversepairscore(int* data,int* copy,int start,int end)

if(start==end)

int length=(end-start)/2;

int left=inversepairscore(copy,data,start,start+length);

int right=inversepairscore(copy,data,start+length+1,end);

int i=start+length;

int j=end;

int indexcopy=end;

int count=0;

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

else}

for(;i>=start;--i)

copy[indexcopy--]=data[i];

for(;j>=start+length+1;--j)

copy[indexcopy--]=data[j];

return left+right+count;

面試題 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 1.如果對每乙個數字,依此查詢它前面的所有數字,複雜度為o n2 2.結合歸併排序的思想,複雜度為...

面試題29 陣列中的逆序對

暴力方法 掃瞄陣列中的每個數,逐個比較該數字和其後面的數字的大小,若後面的數字比其小,則是乙個逆序對。改進方法 先把陣列分割成子陣列,先統計出子陣列內部的逆序對數,然後再統計出兩個相鄰子陣列見的逆序對數。統計逆序對的過程中,需要對陣列進行排序。顯然排序過程是歸併排序。時間複雜度由o n 2 降為o ...

面試題36 陣列中的逆序對

題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如,有乙個陣列為array 0.n 其中有元素a i a j 如果 當ia j 那麼我們就稱 a i a j 為乙個逆序對。在陣列中一共存在5對逆序對,分別是 7,6 7...