劍指Offer系列51 陣列中的逆序對

2021-10-24 09:20:20 字數 1732 閱讀 2260

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

示例 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...