經典面試題之陣列中的逆序對

2021-07-17 03:57:22 字數 1172 閱讀 7308

1.題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007

2.解題思路

這道題主要是歸併排序思想的應用,如果對歸併排序不了解,請先看

歸併的過程中,使用乙個新陣列儲存排序後的元素,我們會判斷左邊陣列元素是否小於右邊陣列元素,如果是,左邊陣列元素新增到新陣列中,

如果不是,則右邊陣列元素新增到新陣列中,這種情況下,左邊陣列當前元素及其後邊剩下的元素(假設它們和為n個)都會比右邊當前元素大,即會產生n個逆序對,這樣只要在歸併過程中不斷對產生的逆序對進行累加即可

3.**

public class solution 

private static int inversepairscore(int array,int begin,int end)

int mid=(begin+end)/2;

int pairs1=inversepairscore(array,begin,mid);

int pairs2=inversepairscore(array,mid+1,end);

return merge(array,begin,mid+1,end,pairs1+pairs2);

}private static int merge(int array,int begin1,int begin2,int end,int pairs){

int sort=new int[end-begin1+1];

int pointer1=begin1;

int pointer2=begin2;

int end1=begin2-1;

int end2=end;

int k=0;

while(pointer1!=end1+1&&pointer2!=end2+1){

if(array[pointer1]

面試題 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對總數。例如嗎,在陣列中,一共存在5個逆序對,分別是 7,6 7,5 7,4 6,4 和 5,4 思路 作者給出的是基於歸併排序的一種演算法。那麼必然比暴力的o n 2 的好。如下 in...

面試題 陣列中的逆序對

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

面試題29 陣列中的逆序對

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