【发布时间】:2017-04-07 12:17:06
【问题描述】:
我的方法有效,但显然对于 Hackerrank 而言,它在处理大数字时不够快。我该如何优化它? n 是数组大小,k 是数组元素应该向左旋转的次数。
public static int[] arrayLeftRotation(int[] a, int n, int k) {
int[] holder = new int[n];
for(int m=0; m<k; m++)
{
for(int b = 0; b<n; b++)
{
if(b==0) holder[n-1]=a[b];
else holder[b-1]=a[b];
}
a = holder;
holder = new int[n];
}
return a;
}
【问题讨论】:
-
一定要用数组吗?您可以使用
Deque并从头部删除元素并将其添加到尾部。如果您需要一个数组,那么您可能应该将其视为循环并有一个指向“第一个”元素的指针,并在旋转数组时移动指针。 -
那么参数需要保持不变,我需要返回一个数组。
-
如果你需要使用数组,我认为你的代码不需要优化
-
如果这些方法中的任何一个是内在的,那么可能类似于
System#arrayCopy或Arrays#copyOfRange的方法可以优化您的方法。否则我会坚持使用 StinePike 的答案,因为它只是 O(n) 而不是 O(nk)。 -
是的,StinePike 的回答是最好的。我从一个类似于 O(n^2) 的 while 循环开始。没想到会有 O(n) 的解决方案。
标签: java arrays optimization