优化代码以减少交换次数

时间:2019-02-12 02:28:13

标签: python sorting

为您提供了一个无序数组,该数组由连续的整数[1, 2, 3, ..., n]组成,没有重复项。您可以交换任意两个元素。您需要找到按升序对阵列进行排序所需的最小交换次数。我得到的代码在一些测试用例中超时。是否有任何方法可以优化代码?

我的代码如下:

def minimumSwaps(arr):
    lst=[ele+1 for ele in range(len(arr))]
    cnt=0
    for i in range(len(arr)):
        if(lst[i]!=arr[i]):
            k=arr.index(lst[i])
            arr[i],arr[k]=arr[k],arr[i]
            cnt=cnt+1
    return cnt

1 个答案:

答案 0 :(得分:1)

您实际上并不需要生成引用列表lst,因为您应该知道n中的arr应该在索引n-1中才能升序。此外,进行k=arr.index(lst[i])的搜索需要O(n)的时间,这完全是不必要的。这是我的解决方案:

def minimumSwaps(arr):
    total_swaps = 0
    start = 0
    while start < len(arr):
        if arr[start] == start + 1:
            start += 1
            continue
        arr[arr[start] - 1], arr[start] = arr[start], arr[arr[start] - 1]
        total_swaps += 1
    return total_swaps

如果我猜对了,这是关于Hackerrank的问题,这是通过测试时我的解决方案。 :P