假设我有以下数组:
1, 4, 5, 2, 3
我需要将其重新排列为
5, 1, 4, 2, 3
只有额外的空间;一个int
。
我想出了一个解决方案。但这是O(n^2)
复杂性。
任何人都可以提供更快的解决方案吗?
由于
编辑: 对不起,不是旋转阵列。
我需要将原始数组更改为结果数组。 订单可以是任意的。 我只需要制作A - > B. B被告知了我。
感谢
编辑2“
让它更清晰。 数组B不固定。 我们需要找到一个通用的解决方案。
更新:
谢谢大家。这似乎是一个脑筋急转弯的问题。哈哈:D
我的朋友被亚马逊采访者问过这个问题。 LOL
答案 0 :(得分:2)
在我看来,这只是对数组进行排序的一种特殊情况,其中排序顺序相当随意。因此,最佳算法将具有时间复杂度O(n log n),并且使用进行就地排序的算法(以不是稳定排序为代价)将具有空间复杂度O(1)。如果平均 O(n log n)正常,那么就地merge sort将适合该帐单,就地quicksort。
答案 1 :(得分:1)
此解决方案使用O(1)空间。
>>> def arrayswap(source, dest):
... for i in range(len(dest)):
... source[source.index(dest[i])], source[i] = source[i], source[source.index(dest[i])]
...
>>> a = [1, 4, 5, 2, 3]
>>> b = [5, 1, 4, 2, 3]
>>> arrayswap(a, b)
>>> a
[5, 1, 4, 2, 3]
不使用python的元组打包,source [i]或source [source.index(dest [i])]之一的值可以存储在int中。
答案 2 :(得分:0)
看起来你只是将前三个元素向左移动(带有环绕)。
所以,忽略索引3和4。
int temp = array[0]
array[0] = array[1]
array[1] = array[2]
array[2] = temp
答案 3 :(得分:-1)
你可以这样做:
temp = arr[0];
arr[0] = arr[2];
arr[2] = arr[4];
arr[4] = arr[1];
arr[1] = arr[3];
arr[3] = temp;
要将数组a重新排列为数组b,您可以这样做:
for (var i = 0; i < a.length; i++) {
for (var j = i + 1; a[i] != b [i]; j++) {
var temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
演示:http://jsfiddle.net/Guffa/5sKdM/
我不确定这个大O是什么,但是通过示例数据,它进行了7次比较和2次交换,所以这肯定比O(n 2 )好。
另外,我不确定究竟什么算作“额外空间”,所以我不知道这是否满足一个额外空间的要求,但如果没有,那么当前接受的答案也不是...