【发布时间】: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。 -
一般情况下,Quicksort 和 Merge Sort 效率更高(
n log(n))(包括交换次数),我认为这两个都可以就地运行。 -
连续整数不是已经升序了吗?