【忍者算法】从风扇叶片到数组轮转:探索轮转数组问题|LeetCode 189 轮转数组

news/2025/2/5 22:11:55/文章来源:https://www.cnblogs.com/renzhesuanfa/p/18700226

从风扇叶片到数组轮转:探索轮转数组问题

生活中的算法

想象你在看一个风扇缓缓转动,每次转动三个叶片的距离。原本在上方的叶片转到了右侧,原本在右侧的叶片转到了下方...这就是一个生动的轮转过程。再比如,幼儿园老师让小朋友们围成一个圈,喊"向右移动3个位置",每个小朋友就会走到新的位置上。

这种轮转在生活中处处可见:餐厅的轮转座位安排、值班表的轮转、超市商品的轮换陈列,甚至是农田的轮作制度。它们都体现了同样的规律:保持原有顺序,整体移动特定步数。

问题描述

LeetCode第189题"轮转数组"是这样描述的:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

例如:

输入: 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]

最直观的解法:临时数组

就像小朋友们轮转位置时,先站到新位置再坐下。我们可以用一个临时数组记录每个元素的新位置。

让我们用一个简单的例子来理解:

原数组:[1,2,3,4], k = 2
1. 创建临时数组:[0,0,0,0]
2. 1应该移动到位置(0+2)%4=2:[0,0,1,0]
3. 2应该移动到位置(1+2)%4=3:[0,0,1,2]
4. 3应该移动到位置(2+2)%4=0:[3,0,1,2]
5. 4应该移动到位置(3+2)%4=1:[3,4,1,2]
6. 复制回原数组:[3,4,1,2]

优化解法:三次翻转

仔细观察会发现一个有趣的规律:如果我们把数组分成两部分,右边k个元素和左边其余元素,只需要三步就能完成轮转:

  1. 翻转整个数组
  2. 翻转前k个元素
  3. 翻转后面的元素

就像打扑克牌时的切牌技巧:先整叠反转,再分别调整两叠的顺序。

三次翻转的原理

用餐桌座位来理解:

  1. 所有人起立,从左到右交换位置(整体翻转)
  2. 前k个人调整自己的相对位置(前k个翻转)
  3. 剩下的人调整自己的相对位置(剩余部分翻转)

示例演示

用nums = [1,2,3,4,5], k = 2来说明:

原始数组:[1,2,3,4,5]1. 整体翻转:
[1,2,3,4,5] -> [5,4,3,2,1]2. 翻转前k个:
[5,4,3,2,1] -> [4,5,3,2,1]3. 翻转剩余部分:
[4,5,3,2,1] -> [4,5,1,2,3]

Java代码实现

public void rotate(int[] nums, int k) {if (nums == null || nums.length <= 1) {return;}// 处理k大于数组长度的情况k = k % nums.length;if (k == 0) return;// 1. 翻转整个数组reverse(nums, 0, nums.length - 1);// 2. 翻转前k个元素reverse(nums, 0, k - 1);// 3. 翻转剩余元素reverse(nums, k, nums.length - 1);
}private void reverse(int[] nums, int start, int end) {while (start < end) {// 交换首尾元素int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}
}

解法比较

让我们比较这两种方法:

临时数组法:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 优点:思路直观,易于理解
  • 缺点:需要额外空间

三次翻转法:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  • 优点:空间效率高,实现简单
  • 缺点:思路不够直观

思考启发

这道题告诉我们:

  1. 有时候直观的解法不一定是最优的
  2. 观察数据规律很重要
  3. 在处理环形结构时,取余运算很有用
  4. 翻转操作可以用来改变元素位置关系

类似的问题还有:

  • 反转字符串
  • 字符串轮转
  • 循环队列的实现

小结

通过轮转数组这道题,我们不仅学会了一个经典的数组操作技巧,更重要的是理解了如何通过观察数据特征,找到优雅的解决方案。记住,当遇到需要移动元素位置的问题时,考虑一下翻转操作是否能帮助我们!


作者:忍者算法
公众号:忍者算法

我准备了一份刷题清单,以及这些题目的详细题解,覆盖了绝大部分常见面试题。我可以很负责任地说,只要你把这些题真正掌握了,80%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879287.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Tauri框架打造的FPS透视

使用Tauri框架打造的FPS透视,使用javascript读内存绘制透视框使用Vue前端和Rust后端打造FPS透视 前端使用P5js进行canvas绘制 后端封装内存读取工具,前端快速编写代码无需重启调试 Vue前端与后端通讯获取内存数据并在前端渲染 作者声明 [仅供学习 请勿非法用途 从事非法用途出…

Mybatis 动态查询

where和if标签搭配 user表如下图所示 有时候,我们想在java程序中自定义查询条件,例如,我想查询user表,有时候我输入name=“狂神”,查询所有name为狂神的数据,有时候我输入pwd=‘123456’,想查询所有密码为123456的数据,有时候我想查询name为狂神同时密码为123456的数据…

一文搞懂企业架构与DDD的融合

在当今数字化时代,企业架构(EA)和领域驱动设计(DDD)成为了构建高效、灵活且可扩展软件系统的关键方法论。本文将深入探讨企业架构TOGAF框架与DDD的融合之道,分析如何通过这种结合实现从业务战略到技术实现的无缝对接。今天聊聊企业架构与DDD如何进行融合。一、企业架构TO…

【监控】ElastAlert 实现 ES 钉钉群日志告警

一、ElastAlert 概述 ElastAlert 是一个开源的警报框架,由 Yelp 开发,它可以从 Elasticsearch 中提取数据并根据预定义的规则生成警报。ElastAlert 可用于监控您的日志和时间序列数据,以便在发生异常、错误或其他有趣的模式时立即采取行动。ElastAlert 能够与许多通知服务(…

状压dp串讲

知识讲解 前置知识:位运算 (学过的可以跳过) 众所周知,电脑使用的是二进制,那么对二进制位进行的计算就叫做位运算。那么经典的位运算有以下几种:&(按位与)规律:除非两者均为 \(1\),否则其他情况结果均为 \(0\)。若两者为均唯一则答案为 \(1\)。 |(按位或)规律…

DeepSeek本地化部署

DeepSeek-R1本地化部署 在 Mac 上使用 Ollama 运行 DeepSeek-R1,并通过 Open-WebUI 提供 Web 端访问。 1. 安装 Ollama Ollama官方:https://ollama.com/ Ollama 是一个轻量级的 AI 推理框架,支持本地运行 LLM(大型语言模型)。首先,下载并安装 Ollama。 # brew安装ollama …

微服务 - 服务雪崩和限流

1. 服务雪崩 1.1 什么是服务雪崩? 在微服务中,假如一个或者多个服务出现故障,如果这时候,依赖的服务还在不断发起请求,或者重试,那么这些请求的压力会不断在下游堆积,导致下游服务的负载急剧增加。不断累计之下,可能会导致故障的进一步加剧,可能会导致级联式的失败,甚…

CTF-web-矛盾

1.打开链接,查看题目2.要求输入数字1但是又不允许输入数字,可输入1a,弱比较 “=”转化后即为13.即可获得flag

DRF 视图

视图概览 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。 视图的继承关系: 视图的方法与属性: Request 与 Response 1. Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpReques…

MySQL训练营-如何判断SQL的主要消耗阶段

慢查询分析思路确认是锁还是执行消耗对于执行消耗,分析执行过程基础知识回顾 InnoDB 聚簇索引结构 CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT,`a` int DEFAULT NULL,`b` int DEFAULT NULL,`c` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `a` (`a`),KEY `bc` (`b`,c…

windows本地部署deepseek-R1模型并接入wx

1、本地部署deepseek-R1模型 通过官网 https://ollama.com 下载安装 ollama 选择自身GPU显存适合的 模型,这里我用的8b ollama run deepseek-r1:8b2、hook wechat接入对话 通过项目 https://github.com/ngc660sec/NGCBot hook wechat想必这种方式会比docker+cow网页版登录的方…