返回

从基础到实操:旋转数组算法剖析

前端

旋转数组的定义:

给定一个数组和一个数字key,将数组向右旋转key次,即数组的最后key个元素移动到数组的最前面。例如,给定数组[1, 2, 3, 4, 5, 6, 7]和key = 3,旋转后得到[5, 6, 7, 1, 2, 3, 4]。

旋转数组的实现思路:

  1. 基本思路:
    • 将数组从0到key-1的部分移动到数组的最后。
    • 将数组从key到数组末尾的部分移动到数组的开头。
  2. 优化思路:
    • 使用辅助数组:创建辅助数组并进行拷贝,可以避免多次移动元素,提高效率。

时间复杂度和性能:

  • 基本思路时间复杂度: O(n^2)
  • 优化思路时间复杂度: O(n)
  • 空间复杂度: O(n)

示例代码:

// 基本思路
function rotateArray1(arr, key) {
  // 校验输入
  if (arr === null || arr.length === 0 || key < 0 || key > arr.length) {
    return arr;
  }

  // 将数组从0到key-1的部分移动到数组的最后
  for (let i = 0; i < key; i++) {
    let temp = arr[i];
    for (let j = i; j < arr.length - 1; j++) {
      arr[j] = arr[j + 1];
    }
    arr[arr.length - 1] = temp;
  }

  return arr;
}

// 优化思路
function rotateArray2(arr, key) {
  // 校验输入
  if (arr === null || arr.length === 0 || key < 0 || key > arr.length) {
    return arr;
  }

  // 创建辅助数组
  let aux = new Array(arr.length);

  // 将数组从key到数组末尾的部分移动到辅助数组的开头
  for (let i = key; i < arr.length; i++) {
    aux[i - key] = arr[i];
  }

  // 将数组从0到key-1的部分移动到辅助数组的最后
  for (let i = 0; i < key; i++) {
    aux[arr.length - key + i] = arr[i];
  }

  // 将辅助数组拷贝回原数组
  for (let i = 0; i < arr.length; i++) {
    arr[i] = aux[i];
  }

  return arr;
}

总结:

旋转数组是编程中常见的问题,掌握有效的旋转数组算法对于解决各种实际问题非常重要。通过本文的讲解和示例代码,相信您已经对旋转数组算法有了更深入的了解和掌握。在实际应用中,您可以根据具体场景选择合适的方法来实现旋转数组,以满足您的特定需求。