面試題51 陣列中的逆序對

2022-06-12 11:51:12 字數 825 閱讀 3971

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

很容易想到從後往前折半插入排序時順便記錄比當前數小得數,但是這種方法在用例30的時候就超時了。。

class

solution

nums[ed]=tmp;

return ed-st+1

; }

while(lint tmp=nums[pivot];

for(int i=st;i)

nums[l-1]=tmp;

return l-st;

}int reversepairs(vector&nums)

return

res;

}};

然後我就思考畢竟插入排序要移動陣列元素,最後的總體時間複雜度是o(n^2),那麼找到乙個插入和比較都是logn複雜度的演算法不就可以了嗎,那不就是歸併排序嗎!

當然,需要o(n)的額外空間,時間複雜度為o(logn)

class

solution

else

tmp[l3++]=nums[l2++];

}while(l1<=mid)

while(l2<=right)tmp[l3++]=nums[l2++];

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

}void mergesort(vector& nums, int left, int

right)

}int reversepairs(vector&nums)

};

面試題51 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如在陣列中,一共存在5個逆序對,分別是 7,6 7,5 7,4 6,4 5,4 看到這道題目,第一反應是順序掃瞄整個陣列,沒掃瞄到乙個數字,逐個比較該數字和它後面數字的大小,...

面試題51 陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 看到這個題目,我們的第一反應是順序掃瞄整個陣列。每掃瞄到乙個陣列的時候,逐個比較該數字和它後...

面試題51 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 輸入 7 5,6 4 輸出 5先說自己想法 暴力法先來一遍,嗯 超時了!不知所措的我開啟了題解,前面又是一片光明!就是在歸併排序的基礎上新增了乙個計數變數,當合併兩個子陣...