当前位置: 首页 > article >正文

【练习】力扣 热题100 轮转数组

题目 轮转数组

给定一个整数数组 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]

来源:力扣 热题100 轮转数组


题解

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.size() == 1)
            return;
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k % nums.size());
        reverse(nums.begin() + k % nums.size(), nums.end());
        return;
    }
};

代码分析:

  1. 检查数组是否只有一个元素

    if(nums.size() == 1)
        return;
    

    如果数组的长度为1,那么无论旋转多少次,数组都不会改变,因此直接返回。

  2. 反转整个数组

    reverse(nums.begin(), nums.end());
    

    将整个数组反转。例如,如果数组是 [1, 2, 3, 4, 5],反转后变为 [5, 4, 3, 2, 1]

  3. 反转前 k % nums.size() 个元素

    reverse(nums.begin(), nums.begin() + k % nums.size());
    

    反转数组的前 k % nums.size() 个元素。这里使用 k % nums.size() 是为了处理 k 大于数组长度的情况。例如,如果 k = 2,数组是 [5, 4, 3, 2, 1],反转前2个元素后变为 [4, 5, 3, 2, 1]

  4. 反转剩余的元素

    reverse(nums.begin() + k % nums.size(), nums.end());
    

    反转从第 k % nums.size() 个元素到数组末尾的部分。继续上面的例子,剩余的元素 [3, 2, 1] 反转后变为 [1, 2, 3],最终数组为 [4, 5, 1, 2, 3]


举例说明:

假设输入数组为 nums = [1, 2, 3, 4, 5]k = 2,运行过程如下:

  1. 反转整个数组

    • 原数组:[1, 2, 3, 4, 5]
    • 反转后:[5, 4, 3, 2, 1]
  2. 反转前 k % nums.size() 个元素

    • k % nums.size() = 2 % 5 = 2
    • 反转前2个元素:[4, 5, 3, 2, 1]
  3. 反转剩余的元素

    • 剩余元素:[3, 2, 1]
    • 反转后:[1, 2, 3]
    • 最终数组:[4, 5, 1, 2, 3]

输出结果为 [4, 5, 1, 2, 3],即数组向右旋转了2步。


时间复杂度:

  • O(n),其中 n 是数组的长度。因为每个元素被反转了两次(整体反转和部分反转),但总的操作次数仍然是线性的。

空间复杂度:

  • O(1),因为没有使用额外的空间,所有操作都是在原数组上进行的。

总结:

这段代码通过三次反转操作实现了数组的旋转,是一种非常高效且简洁的实现方式。它的核心思想是通过反转来重新排列数组元素,避免了使用额外的空间,同时保证了线性的时间复杂度。


http://www.kler.cn/a/501752.html

相关文章:

  • Apache JMeter 压力测试使用说明
  • 什么是JUC?
  • OStree技术简介
  • golang OpcUaClient
  • 汽车电子相关的协议UDS、DOIP、CAN
  • Spring中三级缓存详细讲解
  • Facebook 跨文化交流:打破国界的社交纽带
  • Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统系列文章(四)
  • 【PyQt】如何在mainwindow中添加菜单栏
  • mac安装java17
  • GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目
  • ASP.NET Core - 自定义中间件
  • (10)Ajax
  • Spring 核心指南(上):IoC 容器与配置方式详解
  • bert微调下游任务-情感分析
  • WRF模式与Python融合技术在多领域中的应用及精美绘图;Python助力WRF自动化运行、WRF模式前后处理等
  • 达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介
  • ASP.NET Core 中,Cookie 认证在集群环境下的应用
  • c# 和python封装起保停
  • 功能篇:mybatis中实现缓存
  • JSON头文件调用
  • Fastapi0.115.6之Tortoise ORM0.23.0基本增删改查大全【亲测可用,仅供参考】
  • AIDD-人工智能药物设计-通过组合生物合成产生新的类似物的抗真菌费尔南型三萜多聚类素的生物合成表征
  • AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理
  • uni-app持久化登录简单实现
  • 八、系统托盘与配置面板