数据结构:旋转数组

方法1 (三次逆置法):

cpp 复制代码
void reverse(int* nums, int start, int end) {
    while (start < end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;  // 防止 k 大于数组长度
    if (k == 0) return;  // 如果 k 为 0,则无需旋转

    reverse(nums, 0, numsSize - 1);      // 逆置整个数组
    reverse(nums, 0, k - 1);             // 逆置前 k 个元素
    reverse(nums, k, numsSize - 1);      // 逆置剩余的元素
}

时间复杂度:O(N),空间复杂度:O(1)

方法2(使用临时数组):

cpp 复制代码
void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;  // 防止 k 大于数组长度
    if (k == 0) return;  // 如果 k 为 0,则无需旋转

    // 分配内存保存最后 k 个元素
    int* temp = (int*)malloc(sizeof(int) * k);
    if (temp == NULL) {
        printf("动态开辟失败\n");
        return;
    }

    // 保存最后 k 个元素到临时数组中
    for (int i = 0; i < k; i++) {
        temp[i] = nums[numsSize - k + i];
    }

    // 将前面的元素向后移动
    for (int i = numsSize - k - 1; i >= 0; i--) {
        nums[i + k] = nums[i];
    }

    // 将临时数组中的元素移到前面
    for (int i = 0; i < k; i++) {
        nums[i] = temp[i];
    }

    // 释放临时数组
    free(temp);
}

时间复杂度:O(N) ,空间复杂度:O(N)

相关推荐
代码雕刻家7 分钟前
1.9.课设实验-数据结构-图-校园跑最短路径
c语言·数据结构·算法·图论
white-persist21 分钟前
【攻防世界】reverse | re1-100 详细题解 WP
c语言·开发语言·网络·汇编·python·算法·网络安全
.YM.Z35 分钟前
【数据结构】:排序(二)——归并与计数排序详解
数据结构·算法·排序
武帝为此36 分钟前
【数据结构之树状数组】
数据结构·算法
失败才是人生常态37 分钟前
算法题归类学习
学习·算法
天赐学c语言1 小时前
12.6 - K个一组翻转链表 && C 编译到执行的4个阶段
数据结构·c++·链表·c编译
leoufung1 小时前
用 DFS 拓扑排序吃透 LeetCode 210:Course Schedule II
算法·leetcode·深度优先
chao1898441 小时前
电容层析成像Tikhonov算法
算法
会挠头但不秃1 小时前
2.逻辑回归模型
算法·机器学习·逻辑回归
✎ ﹏梦醒͜ღ҉繁华落℘1 小时前
菜鸟的算法基础
java·数据结构·算法