返回
从基础到实操:旋转数组算法剖析
前端
2023-11-14 17:02:41
旋转数组的定义:
给定一个数组和一个数字key,将数组向右旋转key次,即数组的最后key个元素移动到数组的最前面。例如,给定数组[1, 2, 3, 4, 5, 6, 7]和key = 3,旋转后得到[5, 6, 7, 1, 2, 3, 4]。
旋转数组的实现思路:
- 基本思路:
- 将数组从0到key-1的部分移动到数组的最后。
- 将数组从key到数组末尾的部分移动到数组的开头。
- 优化思路:
- 使用辅助数组:创建辅助数组并进行拷贝,可以避免多次移动元素,提高效率。
时间复杂度和性能:
- 基本思路时间复杂度: 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;
}
总结:
旋转数组是编程中常见的问题,掌握有效的旋转数组算法对于解决各种实际问题非常重要。通过本文的讲解和示例代码,相信您已经对旋转数组算法有了更深入的了解和掌握。在实际应用中,您可以根据具体场景选择合适的方法来实现旋转数组,以满足您的特定需求。