数组中的逆序对

数组中的逆序对

题目:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序 对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、 (7,5)、(7,4)、(6,4)和(5,4)。

分析:迭代求解的三个要素:
1.每一步迭代需要做的事情
2.迭代的输入和返回值
3.迭代的终止条件

# give a arr, get all inverse pairs

# use recurse, for a arr ->
# from middle split it to two arrs, then ->
# get inverse pairs in each arr and ->
# meger two arrs, in merging, get inverse pairs between two arrs ->
# return sorted merged arr, recurse end when splited arrs length is one


# some standard write ways: in a class, dont let global value in, let vriable ->
# value in, such as self.pairs, in merge_recurse, it can use it, ->
# but arr is variable, so give self.arr as initial value.
class InversePairs:
    def __init__(self,arr):
        self.arr = arr

    def getInversePairs(self):
        print(self.arr)
        self.pairs = []
        self.merge_recurse(self.arr)
        return self.pairs
    def merge_recurse(self,arr):
        if len(arr)==1:
            return arr

        middle_index = len(arr)//2
        leftArr = arr[0:middle_index]
        rightArr = arr[middle_index:]
        leftArr = self.merge_recurse(leftArr)
        rightArr = self.merge_recurse(rightArr)
        
        i=len(leftArr)-1
        j=len(rightArr)-1
        newArr = []
        while i>=0 and j>=0: # get pairs, merge two arrs
            if leftArr[i]>rightArr[j]:
                for kk in range(0,j+1):
                    pair = leftArr[i],rightArr[kk]
                    self.pairs.append(pair)
                newArr.append(leftArr[i])
                i-=1
            elif leftArr[i]<rightArr[j]:
                newArr.append(rightArr[j])
                j-=1
            else:
                for kk in range(0,j):
                    pair = leftArr[i],rightArr[kk]
                    self.pairs.append(pair)
                newArr.append(leftArr[i])
                i-=1
        # i==-1 or j==-1
        while i>=0:
            newArr.append(leftArr[i])
            i-=1
        while j>=0:
            newArr.append(rightArr[j])
            j-=1
        newArr.reverse()
        return newArr


arr = InversePairs([7,5,6,4])
res = arr.getInversePairs()
print(res)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值