题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
mod = 1000000007
def MergeSort(self, left: int, right: int, data: List[int], temp: List[int]) -> int:
# 停止划分
if left >= right:
return 0
# 取中间
mid = int((left + right) / 2)
# 左右划分合并
res = self.MergeSort(left, mid, data, temp) + self.MergeSort(mid + 1, right, data, temp)
# 防止溢出
res %= self.mod
i, j = left, mid + 1
for k in range(left, right+1):
temp[k] = data[k]
for k in range(left, right+1):
if i == mid + 1:
data[k] = temp[j]
j += 1
elif j == right + 1 or temp[i] <= temp[j]:
data[k] = temp[i]
i += 1
# 左边比右边大,答案增加
else:
data[k] = temp[j]
j += 1
# 统计逆序对
res += mid - i + 1
return res % self.mod
def InversePairs(self , data: List[int]) -> int:
n = len(data)
res = [0 for i in range(n)]
return self.MergeSort(0, n - 1, data, res)
Error:
class Solution:
mod = 100000007
def MergeSort(self,left:int, right:int, data: list[int], temp:list[int]) -> int:
if left >= right:
return 0
mid = int((left+right)/2)
res = self.MergeSort(left,mid,data,temp) + self.MergeSort(mid+1,right,data,temp)
res %= self.mod
i, j = left, mid + 1
for k in range(left, right+1):
temp[k] = data[k]
for k in range(left, right+1):
if i == mid +1:
data[k] = temp[j]
j+= 1
elif j == right + 1 or temp[i] <= temp[j]:
data[k] = temp[i]
i += 1
else:
data[k] = temp[j]
j += 1
res += mid -i + 1
return res % self.mod
def InversePairs(self , data: List[int]) -> int:
# write code here
"""归并排序思路
1.划分阶段;
2.排序阶段;
3.合并阶段
"""
n = len(data)
res = [0 for i in range(n)]
return self.MergeSort(0,n-1,data,res)
