在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
示例 1:
輸入: [7,5,6,4]
輸出: 5
限制:0 <= 陣列長度 <= 50000
python
# 思路:
# 利用陣列部分有序,採用歸併排序思想
# 輔助度:
# o(nlogn)
class
solution
:def
mergesort
(self,nums,tmp,l,r)
:if l>=r:
return
0
mid=
(l+r)//2
count=self.mergesort(nums,tmp,l,mid)
+self.mergesort(nums,tmp,mid+
1,r)
i,j,pos=l,mid+1,l
while i<=mid and j<=r:
if nums[i]
<=nums[j]
: tmp[pos]
=nums[i]
i+=1 count+=
(j-(mid+1)
)else
: tmp[pos]
=nums[j]
j+=1 pos+=
1for k in
range
(i,mid+1)
: tmp[pos]
=nums[k]
count+=
(j-(mid+1)
) pos+=
1for k in
range
(j,r+1)
: tmp[pos]
=nums[k]
pos+=
1 nums[l:r+1]
=tmp[l:r+1]
return count
defreversepairs
(self, nums: list[
int])-
>
int:
n=len(nums)
tmp=[0
]*nreturn self.mergesort(nums,tmp,
0,n-
1)
c++class
solution
intmergesort
(vector<
int>
& nums,vector<
int>
& tmp,
int l,
int r)
else
++pos;
}for
(int k=i;k<=mid;
++k)
for(
int k=j;k<=r;
++k)
copy
(tmp.
begin()
+l,tmp.
begin()
+r+1
,nums.
begin()
+l);
return count;}}
;
劍指offer系列 51 構建乘積陣列
給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。注意 規定b 0 a 1 a 2 a n 1 b n 1 a 0 a 1 a n 2 對於a長度為1的情況,b無意義,故而無法構建,因此該情況不會...
劍指offer系列 51 構建乘積陣列
q 給定乙個陣列 a 0,1,n 1 請構建乙個陣列 b 0,1,n 1 其中b中的元素 b i a 0 a 1 a i 1 a i 1 a n 1 不能使用除法。注意 規定 b 0 a 1 a 2 a n 1 b n 1 a 0 a 1 a n 2 a 解釋下 設有陣列大小為5。對於第乙個for迴...
劍指offer系列 陣列中逆序對
題目描述 輸入乙個陣列,求出其中逆序對的總個數 示例 輸入 逆序對有,幾種情況 因此輸出5 分析 利用歸併排序的思想進行排序,時間複雜度o nlgn int inversepairscore vector nums,vector copy,int begin,int end int mid begi...