LeetCode热题100——189.轮转数组(题解+答案+要点)

题目:

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

示例 1:

输入: nums = 1,2,3,4,5,6,7, k = 3
输出:5,6,7,1,2,3,4

解释:

向右轮转 1 步:7,1,2,3,4,5,6

向右轮转 2 步:6,7,1,2,3,4,5

向右轮转 3 步:5,6,7,1,2,3,4

示例 2:

输入: nums = -1,-100,3,99, k = 2
输出: 3,99,-1,-100
解释:

向右轮转 1 步: 99,-1,-100,3

向右轮转 2 步: 3,99,-1,-100

提示:

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

题解:

观察旋转后的数组特点:

  • 原数组 [1,2,3,4,5,6,7] 向右旋转 3 步后得到 [5,6,7,1,2,3,4]

  • 旋转结果可以看作:原数组的后 k 个元素移到前面,前 n-k 个元素移到后面

利用数组**反转(reverse)**可以在 O(1) 额外空间内实现:

  1. 反转整个数组 → 后 k 个元素跑到了前 k 个位置,但顺序是反的。

  2. 反转前 k 个元素 → 将前 k 个元素恢复正确顺序。

  3. 反转后 n-k 个元素 → 将剩余元素恢复正确顺序。

答案:

cpp 复制代码
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.size()==0) return;
        k=k%nums.size();
        if(k==0) return;
        //reverse(first, last) 反转的是 [first, last) 区间,左闭右开,即包含 first 指向的元素,不包含 last 指向的元素。
        //反转整个数组
        reverse(nums.begin(),nums.end());
        //反转前 k 个元素
        reverse(nums.begin(),nums.begin()+k);
        //反转后 n-k 个元素
        reverse(nums.begin()+k,nums.end());       
    }
};

要点:

  • 反转区间 :C++ 标准库 reverse(first, last) 反转的是**[first, last)** 左闭右开区间。
  • k 可能大于数组长度 :当 k 大于数组长度时,向右轮转 n 步(n 为数组长度)会使数组完全回到原始状态。所以需执行 **k = k % nums.size()**来得到真正需要移动的步数。
相关推荐
rannn_1111 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer2 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴2 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站2 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
青瓦梦滋3 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
AI备案指南-满满3 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤3 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝3 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林4 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展