【问题标题】:Min swaps to sort unordered consecutive integers最小交换以对无序连续整数进行排序
【发布时间】:2019-02-12 02:28:12
【问题描述】:

给定一个由连续整数[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..n] 上不使用O(n) 效率进行交换,您最好使用Radix Sort,或针对此类问题优化的子类型Counting Sort
  • 一般情况下,QuicksortMerge Sort 效率更高(n log(n))(包括交换次数),我认为这两个都可以就地运行。
  • 连续整数不是已经升序了吗?

标签: python sorting


【解决方案1】:

您实际上不需要生成引用列表lst,因为您应该知道arr 中的n 应该在索引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

此算法从位置 1 开始,并将光标下的项目直接交换到正确的位置。当正确的项目被交换到这个位置时,它会将光标增加到下一个项目并重复该过程。

这比顺序遍历数组、将正确的项目交换到每个位置更有效,因为您不必精确计算正确的项目在列表尾部的位置。

【讨论】:

  • 请告诉我算法的名称是什么,或者如果它没有名称,那么这个想法类似于哪些排序算法?
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 2013-02-15
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2017-01-04
相关资源
最近更新 更多