【问题标题】:Efficient way to Circular left shift of an array by n positions using only a single 1D array.仅使用单个一维数组将数组循环左移 n 个位置的有效方法。
【发布时间】:2017-11-23 06:55:26
【问题描述】:

给定一个包含 n 个整数和一个数字 d 的数组,对数组执行左旋转。给定数组 [1,2,3,4,5] 的示例,移位将始终 [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;
    }

}

【问题讨论】:

  • 确定是O(nk)
  • 是的,它的 O(nk),因为它有一个外部 while 和内部 for 循环权......
  • 我发现java.util.Collections 类对于这类事情来说非常好读。
  • LinkedList这样会不会最有效率,我有感觉。

标签: java arrays


【解决方案1】:

有一个巧妙的技巧可以在O(n) 时间就地执行此操作:

  • 反转整个数组(即在索引0(包括)和n(不包括)之间;
  • 反转索引0(包括)和(n-k)(不包括)之间的数组部分
  • 反转索引(n-k)(包括)和n(不包括)之间的数组部分

(假设0 &lt;= k &lt;= n;如果不是这种情况,只需找到一个不同的k值,以根据上述产生等效旋转的值,例如k = k % n如果k &gt;= 0

每个反转操作都是O(n),有3个,所以总体还是O(n)。就地反转数组也很容易,因此没有额外的内存开销。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2016-06-25
    • 1970-01-01
    • 2019-10-27
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2015-06-18
    相关资源
    最近更新 更多