1、题目描述
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入 1,2,3,4,5,6,7,0
输出 7
2、代码详解
首先要知道 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
牛客网上Python测评运行超时,但如下方法本身没有问题,换成Java和C++可以通过
法一:归并排序
# -*- coding:utf-8 -*-
#import copy as cy
class Solution:
def InversePairs(self, data):
if data == None or len(data) <= 0:
return 0
# 法二
#copy = cy.deepcopy(data)
copy = [0] * len(data)
for i in range(len(data)):
copy[i] = data[i]
#copy = data # 错误写法,[7,5,6,4]被视为一个对象,data和copy均为这个对象的引用
count = self.InversePairsCore(data, copy, 0, len(data)-1)
return count
def InversePairsCore(self, data, copy, low, high):
if low == high:
return 0
mid = low + (high - low)//2
leftCount = self.InversePairsCore(data, copy, low, mid) #
rightCount = self.InversePairsCore(data, copy, mid+1, high)
# 初始化变量
count = 0
i = mid # i初始化为前半段最后一个数字的下标, [0, mid]
j = high # j初始化为后半段最后一个数字的下标, [mid+1, high]
indexCopy = high # Copy数组的下标
while i >= low and j >= mid+1:
if data[i] > data[j]:
copy[indexCopy] = data[i]
indexCopy -= 1
i -= 1
count += j - mid
# print(count)
else:
copy[indexCopy] = data[j]
indexCopy -= 1
j -= 1
# 剩余数组的靠背
while i >= low:
copy[indexCopy] = data[i]
indexCopy -= 1
i -= 1
while j >= mid+1:
copy[indexCopy] = data[j]
indexCopy -= 1
j -= 1
# 赋值给data
for s in range(low, high+1):
data[s] = copy[s]
return leftCount + rightCount + count
法二:使用数据的index进行求解
# -*- coding:utf-8 -*-
class Solution:
def InversePairs(self, data):
# 使用数据的index进行求解
if len(data) <= 0:
return 0
count = 0
copy = []
for i in range(len(data)):
copy.append(data[i])
copy.sort()
i = 0
while len(copy) > i:
count += data.index(copy[i])
data.remove(copy[i])
i += 1
return count