在给定的数组索引之后移动k个数组元素

时间:2012-08-07 06:18:27

标签: algorithm language-agnostic

初始数组:2 23 34 27 89 14 26 30 60

k = 3

从索引i = 1开始,我们必须移动k个元素,使它们出现在数组中的元素26之后(即在givenIndex = 6之后)。

最终数组:2 89 14 26 23 34 27 30 60

我们不允许使用额外的空间。

我的方法:

count = 0;   
while(count < k)  
{  
  count++;  
  temp = arr[i];  
  shift all elements from (i+1) to givenIndex to their immediate left position;  
  arr[givenIndex] = temp;  
}

第一次迭代:
temp = 23
将所有元素从[i + 1](即索引= 2)转移到givenIndex(即index = 6)逐个左移 转移后的数组:2 34 27 89 14 26 26 30 60
arr [givenIndex] = temp
应用此操作后的数组:2 34 27 89 14 26 23 30 60

类似地
第二次迭代后的数组:2 27 89 14 26 23 34 30 60
第三次迭代后的数组:2 89 14 26 23 34 27 30 60

最坏情况复杂度O(n * k)其中n是否。阵列中的元素。

我们能解决O(n)

中的问题吗?

3 个答案:

答案 0 :(得分:1)

旋转可以使用reverse()辅助函数在线性时间内完成。假设reverse(x, y)反转了array[x]..array[y]

reverse(1, 3); // 27 34 23 .. .. ..
reverse(4, 6); // .. .. .. 26 14 89
reverse(1, 6); // 89 14 26 23 34 27

编写线性时间reverse很简单,甚至可以在您喜欢的语言库中使用(例如,C ++包括std::rotatestd::reverse)。

答案 1 :(得分:0)

据我所知,您的代码(以及示例),我认为您试图将块[i,i+k-1]放在块[i+k,givenIndex]

之后

如果是这种情况,@ Blastfurnace的建议确实导致O(n)中的一个解决方案,并且没有额外的空间:

简单地做:

reverse(i,givenIndex)
reverse(i,givenIndex-k)
reverse(givenIndex-k+1,givenIndex)

你有你想要的东西:)

答案 2 :(得分:0)

这个问题非常惊人 在此处查看您要求的答案。如果您正在寻找一种使用JAVA旋转您的arraylist的方法,那么here就有一个完整的解决方案。
public static void rotate(List list, int distance)

只需旋转您的集合(ArrayList或LinkedList ...)
其参数为list(在您的情况下为arraylist)和distance(在您的情况下为k)。你看到了相似之处吗?只需使用它。