189.轮转数组

目录

题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

解法

你可以用 C++ 实现数组向右轮转的方法,最直接的方式是将数组的最后 k 个元素移动到数组的开头,同时将剩下的元素向右移动。以下是一个高效的做法,使用了翻转(reverse)的方法,时间复杂度为 O(n):

  1. 先将整个数组翻转。
  2. 然后翻转前 k 个元素。
  3. 最后翻转剩下的元素。

这里是实现代码:

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm> // for std::reverse

void rotate(std::vector<int>& nums, int k) {
    int n = nums.size();
    // 如果 k 大于数组的长度,我们只需要移动 k % n 次
    k = k % n;
    
    // 步骤 1:翻转整个数组
    std::reverse(nums.begin(), nums.end());
    
    // 步骤 2:翻转前 k 个元素
    std::reverse(nums.begin(), nums.begin() + k);
    
    // 步骤 3:翻转剩余元素
    std::reverse(nums.begin() + k, nums.end());
}

解释:

  1. std::reverse 用来翻转数组或数组的一部分。
  2. k = k % n 确保当 k 大于数组长度时,不会进行不必要的多余轮转。
  3. 首先翻转整个数组,这样原来在数组末尾的元素就会被移到前面。
  4. 然后分别翻转前 k 个和剩余的元素,最终得到向右轮转 k 次的结果。

示例输出:

text 复制代码
5 6 7 1 2 3 4

这样数组就实现了右轮转 k 次。

如何删除最后一个元素以及索引

并没有删除元素,用的翻转的方法

.insert有没有库需要Include

std::reverse怎么用?

std::reverse 是 C++ 标准库中的一个函数,定义在 头文件中,用于反转(翻转)容器或范围内的元素顺序。

std::reverse 的语法:

cpp 复制代码
std::reverse(iterator first, iterator last);
  • first:表示要翻转的范围的起始迭代器(包括 first 指向的元素)。
  • last:表示要翻转的范围的结束迭代器(不包括 last 指向的元素)。

注意:

  • std::reverse 作用在一对迭代器上,也就是它能够作用于任何支持迭代器的容器(如 std::vector, std::deque, std::list 等等),不仅限于数组。
  • 它是就地反转,即不会额外分配内存,直接在原容器内交换元素。

总结轮转过程:

翻转整个数组:{1, 2, 3, 4, 5, 6, 7} -> {7, 6, 5, 4, 3, 2, 1}

翻转前 k 个元素:{7, 6, 5, 4, 3, 2, 1} -> {5, 6, 7, 4, 3, 2, 1}

翻转剩余的元素:{5, 6, 7, 4, 3, 2, 1} -> {5, 6, 7, 1, 2, 3, 4}

为什么会想到用翻转的方法?

翻转是一个 O(n) 的操作,而在这种方法中,我们只需进行三次翻转,每次都是线性时间。因此总的时间复杂度是 O(n),比直接逐一移动每个元素的复杂度要低得多。

通过三次翻转,元素重新排列后得到正确的结果:

让整个数组的末尾元素移动到开头,

同时保持剩下的元素移动到后面的正确位置。

这种方法既简单易懂,又高效,是解决数组轮转问题的常见技巧。

相关推荐
念越2 分钟前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
黎阳之光22 分钟前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
6Hzlia37 分钟前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
CappuccinoRose1 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿
AC赳赳老秦1 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw
Robot_Nav2 小时前
Shape-Aware MPPI(SA MPPI)算法:基于RC-ESDF的任意形状机器人实时轨迹优化
算法·机器人·sa-mppi
踩坑记录3 小时前
leetcode hot100 118. 杨辉三角 easy 动态规划
leetcode·动态规划
小O的算法实验室3 小时前
2026年ESWA,自适应基于排序的协同进化学习粒子群算法+边缘计算服务器部署,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
cpp_25013 小时前
P1832 A+B Problem(再升级)
数据结构·c++·算法·动态规划·题解·洛谷·背包dp
꧁细听勿语情꧂4 小时前
合并两个有序表、判断链表的回文结构、相交链表、环的链表一和二
c语言·开发语言·数据结构·算法