【发布时间】:2021-08-30 04:35:34
【问题描述】:
输入的格式
5
2 3 9 2 9
输出应该是为了按从小到大的顺序排列序列而应该进行的反转次数。即新序列将是 2 2 3 9 9 并从输入中产生这个 2 反转。
2
所以基本上我认为我需要做的是,将输入转换为数组,然后运行以下代码
k = int(input())
str = input()
def getInvCount(arr, n):
inv_count = 0
for i in range(n):
for j in range(i + 1, n):
if (arr[i] > arr[j]):
inv_count += 1
return inv_count
arr = str.split()
n = len(arr)
print(getInvCount(arr, n))
或者我什至尝试过这段代码
k = int(input())
def mergeSort(arr, n):
temp_arr = [0]*n
return _mergeSort(arr, temp_arr, 0, n-1)
def _mergeSort(arr, temp_arr, left, right):
inv_count = 0
if left < right:
mid = (left + right)//2
inv_count += _mergeSort(arr, temp_arr,
left, mid)
inv_count += _mergeSort(arr, temp_arr,
mid + 1, right)
inv_count += merge(arr, temp_arr, left, mid, right)
return inv_count
def merge(arr, temp_arr, left, mid, right):
i = left
j = mid + 1
k = left
inv_count = 0
while i <= mid and j <= right:
if arr[i] <= arr[j]:
temp_arr[k] = arr[i]
k += 1
i += 1
else:
temp_arr[k] = arr[j]
inv_count += (mid-i + 1)
k += 1
j += 1
while i <= mid:
temp_arr[k] = arr[i]
k += 1
i += 1
while j <= right:
temp_arr[k] = arr[j]
k += 1
j += 1
for loop_var in range(left, right + 1):
arr[loop_var] = temp_arr[loop_var]
return inv_count
str = input()
arr = str.split()
n = len(arr)
result = mergeSort(arr, n)
print(result)
但是,在某些情况下,第一个代码会超时,而第二个代码会在那里失败。可以请我帮忙吗?
【问题讨论】:
-
您好,欢迎来到 StackOverflow。你知道第二个在哪种特殊情况下会失败吗?
-
实际上这是一个实践问题,我能够通过网站输入的 6 个测试用例中的 3 个,并且这些用例没有被揭示。
-
非常感谢你的传奇!!!成功了!
-
很高兴它有帮助。您也可以通过单击我的答案左侧的勾号来接受答案,以表明您的疑问已得到解决,并为您和我提供一些声誉。
标签: python arrays sequence mergesort inversion