劍指Offer 32 陣列中的逆序對

2021-10-08 05:44:30 字數 1841 閱讀 2349

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

題目保證輸入的陣列中沒有的相同的數字

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

輸入

1,2,3,4,5,6,7,0輸出7

首先我很糾結乙個問題,這個樹是大於後面的所有數呢?還是只是大於後面的乙個數呢?後來轉念一想,自己真的傻,要是只大於後面所有數字,那不是只有乙個才能滿足條件嗎?最後的逆序對不就是只有乙個?所有肯定是該數字大於它後面的數字,這樣的兩個數組成逆序對啊!

然後,想明白這裡,直接開幹。emmm,直接乙個類似於氣泡排序的玩意就來了。果然超時了,時間複雜的為o(n^n)了。。。

public

class

solution}}

int result = p%

1000000007

;return result;

}}

既然這種方法可行,那說明只需要改進「排序」的方式就ok了啊。於是嘗試一手歸併求。

複習歸併排序的傳送門:面試必備–八大排序演算法

//歸併排序

public

static

void

mergesort

(int

arr,

int low,

int high)

}public

static

void

merge

(int

arr,

int low,

int middle,

int high)

else

index++;}

//處理多餘的資料

while

(j<=high)

while

(i<=middle)

//把臨時陣列中的資料重新存入原陣列

for(

int k=

0;k)}

我承認 這段** 是別人的。因為我完全沒理解為什麼但是在遞迴的時候,就計算了結果的大小cnt = (cnt + (mid-i+1))%1000000007;,而不是求出逆序個數在進行求模運算。。。難道遞迴不會影響到結果嗎?噢。。。原來是每個結果求模相加結果也不變啊。。

public

class

solution

private

void

mergeone

(int

array,

int start,

int mid,

int end)

}while

(i<= mid)

temp[k++

]= array[i++];

while

(j<=end)

temp[k++

]= array[j++];

for(

int l=

0; lpublic

intinversepairs

(int

array)

}

劍指offer32 醜數

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。題意理解 1.直接法。逐個判斷每個整數是不是醜數的解法,直觀但不夠高效 所謂乙個數m是另乙個數n的因子,是指n能被m整除,...

劍指 offer32(一 二 三)

劍指 offer 32 i.從上到下列印二叉樹 思路 利用雙端佇列,每次從雙端佇列的隊頭取出節點,如果該節點存在左子樹和右子樹,則加入隊尾。vector int levelorder treenode root vector int res deque dequetreenode dequetree...

劍指Offer (32)把陣列排成最小的數

題目描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。實現如下 要將所有元素組合成乙個最小的數 那麼組合的相鄰元素之間都是num1num2的形式 所以使用庫函式的sort將各個元素以str...