在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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...