交换列表元素以进行最小交换2的Python超时错误

时间:2019-06-04 01:08:10

标签: python

尝试交换值以建立定序列表(来自HackerRank问题-Minimum Swaps 2),并且代码在大多数测试用例中均有效,但在大数据集上超时。有什么更好的方法可以编写以下代码:

因此,初始列表4 3 1 2应该是经过最小交换次数后的1 2 3 4。

# arr[] = 4 3 1 2 -> 
for i in range(len(arr), 0, -1):
    if i != arr[i-1]:
        arr[i-1], arr[arr.index(i)] = arr[arr.index(i)], arr[i-1]
        swap += 1
return swap

2 个答案:

答案 0 :(得分:1)

使用字典来保存索引,而不是每次循环都使用arr.index(i)。执行交换时,请相应地更新索引字典。

indexes = {el:i for i, el in enumerate(arr)}
for i in range(len(arr), 0, -1):
    if i != arr[i-1]:
        index = indexes[i]
        indexes[i] = i - 1
        indexes[arr[i-1]] = index
        arr[i-1], arr[index] = arr[index], arr[i-1]
        swap += 1
return swap

即使使用arr.index(i),也需要在交换之前对其进行一次调用。左侧的目标表达式是按顺序求值的,因此对arr[i-1]的赋值可能会更改arr.index(i)的结果,而当您将赋值给arr[arr.index(i)]时,最终将赋给错误的位置

答案 1 :(得分:-1)

一个更简单的解决方案是不使用字典,甚至不用管理索引。

只需将弹出的值从开头追加到数组的末尾即可。

for i in range(len(arr), 0, -1):
    arr.append(arr.pop(0))
return arr

这使用内置的python函数将问题简化为单行循环。