使用仅一个1D阵列将数组的左移左移位数的有效方法。

时间:2017-06-20 16:05:13

标签: java arrays

给定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;
    }

}

1 个答案:

答案 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)。它也很容易就地反转一个数组,所以没有额外的内存开销。