【问题标题】:Calculating the number of inversions in a sequence required to arrange it in increasing order [duplicate]计算以递增顺序排列所需的序列中的反转次数[重复]
【发布时间】: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


【解决方案1】:

您可能忘记在将输入传递给归并排序之前将其转换为 int:

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 = list(map(int, str.split()))
n = len(arr)
result = mergeSort(arr, n)
print(result)

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 2016-01-26
    • 2021-08-23
    • 2012-10-30
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多