劍指 Offer 51 陣列中的逆序對

2021-10-09 05:33:59 字數 1857 閱讀 6077

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

示例 1:

輸入: [7,5,6,4]

輸出: 5

限制:0 <= 陣列長度 <= 50000

解題思路:最樸素解法,暴力解法,遍歷所有的資料對,前者大於後者就是一組逆序對

class

solution

return res;

}}

由於時間複雜度o(n^2)的,超出時間限制。

陣列的長度限制是50000,對於乙個o(n^2)的時間複雜度,資料規模達到25億大小。所以使用歸併排序來解決,逆序對問題也是歸併排序的應用。

class

solution

private

void

sort

(int

arr,

int l,

int r,

int[

] temp)

private

void

merge

(int

arr,

int l,

int mid,

int r,

int[

] temp)

else

if(j > r)

else

if(temp[i]

<= temp[j]

)else}}

public

static

void

main

(string[

] args)

;int n =

newsolution()

.reversepairs

(arr)

; system.out.

println

(n);

}}

改進**正規化,不設定res成員變數,直接用函式返回值將結果返回,使用函式式程式設計,減少需要維護的狀態。

class

solution

private

intsort

(int

arr,

int l,

int r,

int[

] temp)

private

intmerge

(int

arr,

int l,

int mid,

int r,

int[

] temp)

else

if(j > r)

else

if(temp[i]

<= temp[j]

)else

}return res;

}public

static

void

main

(string[

] args)

;int n =

newsolution()

.reversepairs

(arr)

; system.out.

println

(n);

}}

提交結果

劍指Offer 51 陣列中的逆序對

在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。樣例輸入 1,2,3,4,5,6,0 輸出 6 class solution object definversepairs self,nums type nums list in...

劍指offer 51 陣列中的逆序對

這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...

劍指offer51 陣列中的逆序對

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