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

LeetCode hot 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]

分析

额外数组法

使用额外的数组来将每个元素放至正确的位置。

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n; // 防止k大于数组长度
        if (k == 0) return; // 如果旋转0次,直接返回
        vector<int> rotated(n); // 创建一个新的数组来存储结果 
        // 将原数组元素放到新数组的正确位置
        for (int i = 0; i < n; ++i) {
            rotated[(i + k) % n] = nums[i];
        } 
        // 将新数组的结果复制回原数组
        nums = rotated;
    }
};

翻转法

可以先将所有元素翻转,这样尾部的 k mod n 个元素就被移至数组头部,然后再翻转 [0,k mod n − 1] 区间的元素和 [k mod n,n − 1] 区间的元素即能得到最后的答案。

时间复杂度:O(n)

空间复杂度:O(1)

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n; // 防止k大于数组长度
        if (k == 0) return; // 如果旋转0次,直接返回
        // 反转整个数组
        reverse(nums.begin(), nums.end());
        // 反转前k个元素
        reverse(nums.begin(), nums.begin() + k);
        // 反转后n-k个元素
        reverse(nums.begin() + k, nums.end());
    }
};

知识充电

reverse() 反转函数

它用于反转给定范围内的元素。你可以使用它来反转数组、容器中的元素,或者任何符合迭代器要求的数据结构。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    // 创建一个数组
    std::vector<int> nums = {1, 2, 3, 4, 5};
    // 反转整个数组
    std::reverse(nums.begin(), nums.end());
    // 只反转部分数组
    std::reverse(nums.begin(), nums.begin() + 3); // 反转前三个元素
    // 输出反转后的数组
    for (int num : nums) {
        std::cout << num << " ";
    }
    return 0;
}

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

相关文章:

  • visual studio 2022 手工写一个简单的MFC程序
  • [原创](Modern C++)现代C++的关键性概念: 什么是友元函数, 什么是友元类?
  • css不出现滚动条
  • T-SQL 语言基础: SQL 数据库对象元数据及配置信息获取
  • 计算机网络——子网掩码
  • 网络安全中keli是什么
  • 初识Qt · 实现hello world的N种细节和对象树
  • Springboot快速接入Deepseek
  • 椭圆函数3D双重周期性交互式演示工具
  • 【hot100】102二叉树的层序遍历
  • 生态安全相关
  • Linux搜索---find
  • 【后端开发面试题】每日 3 题(六)
  • 使用ffmpeg读取mp4文件解码失败
  • Android+SpringBoot的老年人健康饮食小程序平台
  • 基于 Spring Boot 的企业级快速启动模板 —— spring-quick
  • 看视频学习方法总结
  • 知识图谱科研文献推荐系统vue+django+Neo4j的知识图谱
  • 【HarmonyOS Next】自定义Tabs
  • [杂学笔记]面向对象特性、右值引用与移动语义、push_back与emplace_back的区别、读写锁与智能指针对锁的管理、访问网站的全过程