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

Leetcode力扣解题记录--第189题(巧思数组翻转)

题目链接:189. 轮转数组 - 力扣(LeetCode)

题目描述

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

-231 <= nums[i] <= 231 - 1

0 <= k <= 105

题目作答

最简便方法的思想: 解决这个问题最巧妙且高效的方法是使用数组翻转。这个方法是空间复杂度为 O(1) 的原地算法。

思路可以分为三步,以 nums = [1,2,3,4,5,6,7] 和 k = 3 为例:

  1. 处理 k 值: 首先,为了防止 k 大于数组长度而进行不必要的旋转,我们让 k 对数组长度取模。k = k % nums.size()。如果 k 是 7,旋转 7 次等于没旋转;如果 k 是 8,旋转 8 次等于旋转 1 次。所以 k=3 % 7 = 3。

  2. 翻转整个数组: 将数组的所有元素进行翻转。

    • [1,2,3,4,5,6,7] -> [7,6,5,4,3,2,1]

  3. 翻转前 k 个元素: 将数组的前 k 个元素(也就是 [0, k-1] 区间)进行翻转。

    • [7,6,5,4,3,2,1] -> [5,6,7,4,3,2,1]

  4. 翻转后 n-k 个元素: 将数组中剩下的元素(也就是 [k, n-1] 区间)进行翻转。

    • [5,6,7,4,3,2,1] -> [5,6,7,1,2,3,4]

经过这三步翻转,数组就完成了向右轮转 k 个位置的操作,得到了最终结果。这个方法的思想在于通过整体和局部的翻转,巧妙地将数组末尾的 k 个元素移动到了数组的开头。

class Solution {
public:void rotate(vector<int>& nums, int k) {// 获取数组的长度int n = nums.size();// 如果数组为空或只有一个元素,则无需旋转if (n == 0) { return; }// 步骤 1: 处理 k 值,使其在 [0, n-1] 范围内k = k % n;// 步骤 2: 翻转整个数组std::reverse(nums.begin(), nums.end());// 步骤 3: 翻转前 k 个元素std::reverse(nums.begin(), nums.begin() + k);// 步骤 4: 翻转后 n-k 个元素std::reverse(nums.begin() + k, nums.end());}
};

http://www.lryc.cn/news/595042.html

相关文章:

  • Docker安装Elasticsearch 7.17.0和Kibana 7.17.0并配置基础安全
  • 表单校验--数组各项独立校验
  • 计算机发展史:晶体管时代的技术飞跃
  • Web LLM 安全剖析:以间接提示注入为核心的攻击案例与防御体系
  • WinForm-免费,可商用的WinForm UI框架推荐
  • 03-虚幻引擎蓝图类的各父类作用讲解
  • 农村供水智慧化管理系统:从精准监测到智能调度,破解农村用水安全与效率难题
  • Python Locust库详解:从入门到分布式压力测试实战
  • 开发避坑短篇(3):解决@vitejs plugin-vue@5.0.5对Vite^5.0.0的依赖冲突
  • 5G/4G PHY SoC:RNS802,适用于集成和分解的小型蜂窝 RAN 架构。
  • Linux网络信息(含ssh服务和rsync)
  • 模型系列(篇一)-Bert
  • Kotlin 高阶函数初步学习
  • 【MySQL】Linux配置MySQL Windows远程连接
  • 步进电机基础
  • 基于 Nginx 搭建 OpenLab 多场景 Web 网站:从基础配置到 HTTPS 加密全流程
  • ORA-00600: internal error code, arguments: [krse_arc_source_init.1], [4], [2]
  • 汽车售后诊断仪DoIP和CANBus诊断指令分析
  • Milvus:开源向量数据库的初识
  • HTTP性能优化:打造极速Web体验的关键策略
  • Python 进阶(五): Excel 基本操作
  • Android 版本与 API 级别对照速查表
  • Go语言进阶书籍:Go语言高级编程(第2版)
  • Spring Boot05-热部署
  • Python 高效创建多项式及相关计算方法
  • 基于dcmtk的dicom工具 第八章 echoSCU-dicom测试连接
  • Prompt Engineering(提示词工程)基础了解
  • 第三章自定义检视面板_创建自定义编辑器类_编扩展默认组件的显示面板(本章进度6/9)
  • 14.6 《3步实战LLaMA2-7B指令微调:Hugging Face生态+LoRA技术,MT-Bench得分从5.1直升7.3》
  • LeetCode - 3274. Check if Two Chessboard Squares Have the Same Color