陣列中的逆序對

2021-10-07 09:48:54 字數 3150 閱讀 2536

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

思路:1、暴力破解,時間複雜度太大,不能ac

2、歸併排序思想

歸併排序演算法:

// 合併過程

void

merge__

(vector<

int>

&arr,

int l,

int mid,

int r)

else

}while

(i <= mid)

while

(j <= r)

for(k =

0, i = l; i <= r;

++i,

++k)

}// 遞迴劃分過程

void

merge_sort__

(vector<

int>

&arr,

int l,

int r)

int mid = l +

((r - l)

>>1)

;merge_sort__

(arr, l, mid)

;merge_sort__

(arr, mid +

1, r)

;// 合併兩個有序區間

merge__

(arr, l, mid, r);}

// 要排序的陣列 arr

void

merge_sort

(vector<

int>

& arr)

**如下:

class

solution

vector<

int>

temp

(data.

size()

);merge_sort

(data,

0, data.

size()

-1, ret, temp)

;return ret;

}void

merge_sort

(vector<

int>

&data,

int l,

int r,

int&ret, vector<

int>

&temp)

int mid = l +

((r - l)

>>1)

;merge_sort

(data, l, mid, ret, temp)

;merge_sort

(data, mid +

1, r, ret, temp)

;merge

(data, l, mid, r, ret, temp);}

void

merge

(vector<

int>

&data,

int l,

int mid,

int r,

int&ret, vector<

int>

&temp)

else

}while

(i <= mid)

while

(j <= r)

for(i = l, k =

0; i <= r; i++

, k++)}

};

# -*- coding:utf-8 -*-

class

solution

:def

inversepairs

(self, data)

:# write code here

self.ret =

0if data ==

:return self.ret

self.temp =[0

]*len(data)

self.merge_sort(data,0,

len(data)-1

)return self.ret

defmerge_sort

(self, data, l, r)

:if l >= r:

return

mid = l +

((r - l)

>>1)

self.merge_sort(data, l, mid)

self.merge_sort(data, mid +

1, r)

self.merge(data, l, mid, r)

defmerge

(self,data, l, mid, r)

: i = l

j = mid +

1 k =

0while i <= mid and j <= r:

if data[i]

> data[j]

: self.temp[k]

= data[j]

k +=

1 j +=

1 self.ret +=

(mid - i +1)

self.ret %=

1000000007

else

: self.temp[k]

= data[i]

k +=

1 i +=

1while i <= mid:

self.temp[k]

= data[i]

k +=

1 i +=

1while j <= r:

self.temp[k]

= data[j]

k +=

1 j +=

1 i = l

k =0while i <= r:

data[i]

= self.temp[k]

i +=

1 k +=

1

陣列中逆序對

題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...

陣列中的逆序對

來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...

陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...