给定n个整数和数字d的数组,在数组上执行左旋转。给定数组[1,2,3,4,5]的示例和移位将始终< =数组的大小并要求移位1然后输出将是 - > [2,3,4,5,1]。我写了下面的代码,工作正常可以进一步优化,因为我的时间复杂度是O(n ^ 2)
代码:
public static int [] arrayLeftRotation(int [] a,int n,int k){
if (n == 1 || n == k)
return a;
else {
int track = 0;
while (track < k) {
int start = a[0];
for (int i = 0; i < n - 1; i++) {
a[i] = a[i + 1];
}
a[n - 1] = start;
track++;
}
return a;
}
}
答案 0 :(得分:3)
在O(n)
时间内就地执行此操作的巧妙方法:
0
(含)和n
(不包括)之间; 0
(包括)和(n-k)
(不包括)之间反转数组部分(n-k)
(包括)和n
(不包括)之间反转数组部分(这假定为0 <= k <= n
;如果不是这种情况,只需找到k
的不同值,该值会根据上述内容产生等效轮换,例如k = k % n
如果k >= 0
)
每个反转操作都是O(n)
,其中有3个,所以它总是O(n)
。它也很容易就地反转一个数组,所以没有额外的内存开销。