初始数组: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)
中的问题吗?答案 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::rotate
和std::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
)。你看到了相似之处吗?只需使用它。