数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序 对的总数。例如,在数组{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)