【LeetCode】189. 轮转数组

news/2025/3/18 18:00:32/文章来源:https://www.cnblogs.com/yunxizhijian/p/18779464

leetcode

 

在有序数组中实现原地右旋操作,可以通过三次翻转法高效完成。以下是详细实现方法及代码解析:


核心思路:三次翻转法

  1. 整体翻转:将数组所有元素顺序颠倒,使末尾元素前置。
  2. 前k部分翻转:对前k个元素再次翻转,恢复其原有顺序。
  3. 剩余部分翻转:对剩余元素翻转,恢复原有顺序。

Go 代码实现

func rotate(nums []int, k int) {n := len(nums)if n <= 1 || k == 0 {return}k %= n  // 处理k大于数组长度的情况[1,6](@ref)// 自定义翻转函数reverse := func(arr []int, start, end int) {for start < end {arr[start], arr[end] = arr[end], arr[start]start++end--}}reverse(nums, 0, n-1)   // 整体翻转reverse(nums, 0, k-1)   // 前k个元素翻转reverse(nums, k, n-1)   // 剩余元素翻转
}

 


代码解析

  1. 边界处理

    • 当数组长度 ≤1 或 k=0 时直接返回,无需操作。
    • k %= n 确保有效旋转次数(如 nums=[1,2], k=3 等效于 k=1)。
  2. 翻转逻辑

    • 整体翻转:将 [1,2,3,4,5,6,7] 变为 [7,6,5,4,3,2,1]
    • 前k部分翻转:取前k=3个元素 [7,6,5] 翻转成 [5,6,7]
    • 剩余部分翻转:剩余元素 [4,3,2,1] 翻转成 [1,2,3,4],最终得到 [5,6,7,1,2,3,4]。
  3. 时间复杂度

    • O(n),每个元素被翻转两次(整体翻转两次,部分翻转两次)。
  4. 空间复杂度

    • O(1),仅使用双指针变量。

示例验证

  1. 输入nums = [1,2,3,4,5,6,7], k=3

    • 整体翻转 → [7,6,5,4,3,2,1]
    • 前3个翻转 → [5,6,7,4,3,2,1]
    • 剩余部分翻转 → [5,6,7,1,2,3,4]
  2. 输入nums = [-1,-100,3,99], k=2

    • 整体翻转 → [99,3,-100,-1]
    • 前2个翻转 → [3,99,-100,-1]
    • 剩余部分翻转 → [3,99,-1,-100]

扩展方法对比

方法时间复杂度空间复杂度适用场景
三次翻转法 O(n) O(1) 原地操作,推荐使用
环状替换法 O(n) O(1) 数学逻辑复杂
额外数组法 O(n) O(n) 非原地操作,逻辑简单

注意事项

  1. 切片操作边界:Go语言中 nums[:k] 包含第0到k-1个元素,需确保索引正确。
  2. 大数优化k %= n 避免无效旋转(如 k=1e5 而 n=7 时等效于 k=5)。

该方法通过三次翻转实现高效原地旋转,是LeetCode经典题目的标准解法,综合了时间与空间的最优平衡。

 

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

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

相关文章

Git 合并时出现 Please enter a commit message to explain why this merge is necessary 问题解决

1. 报错现象 2. 报错文字merge brach "dev" # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with # will be ignored, and an empty message a…

3.18 学习记录

将仓库管理系统的前端框架使用vue3搭建完成,修改了后端的部分bug,实现了登录功能,其他页面功能还未完成

MySQL 常用储存引擎

1一.存储引擎概述 定义‌:存储引擎是MySQL用于管理数据存储、查询、事务处理的底层组件。 ‌核心作用‌:决定数据如何存储、索引如何组织、事务是否支持等。 点击查看mysql逻辑架构概述 查看数据库所支持的存储引擎SHOW ENGINES; Engine: 表示存储引擎的名称 Support: 表示…

巧用输出变量,提升Dolphinscheduler工作流灵活性和可维护性

输出变量是 DolphinScheduler 任务调度中实现数据流动与任务协作的核心机制,通过显式定义和传递参数,解决了跨节点数据共享、优先级冲突等问题,同时支持复杂流程编排(如子流程、条件分支)。合理使用输出变量能显著提升工作流的灵活性和可维护性。本文将介绍 DolphinSchedu…

3.18 关系

1.1 笛卡尔积 序偶/元组 是有顺序的1.2 笛卡尔积与关系关系就两种:集合A上的二元关系/集合A到集合B的二元关系关系是笛卡尔积的子集 1.3 特殊关系

Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手

Spring AI Alibaba 是一款 Java 语言实现的 AI 应用开发框架,用于加速和简化 Java 开发者的 AI 应用开发,定义 Spring 框架下的 AI 应用开发模式。本项目基于 Pivotal 公司开源的 Spring AI 开源项目构建,突出 Spring AI 与阿里云开源/商业生态的集成与最佳实践,集成范围涉…

干锅菜单

100001、 100002、 100003、 100004、 100005、 100006、 100007、 100008、本人前端水平有限,写的知识点可能有谬误,欢迎留言指正,如果看到,我将第一时间回复。感谢支持!

汤锅菜单

110001、 110002、 110003、 110004、本人前端水平有限,写的知识点可能有谬误,欢迎留言指正,如果看到,我将第一时间回复。感谢支持!

web153笔记(后端不能单⼀校验,后端校验要严密+过滤php+.user.ini文件包含)

这⼀次再传php就拦截下来了,这⾥开始可以⽤ .user.ini 来构造后⻔php.ini是php的⼀个全局配置⽂件,对整个web服务起作⽤;⽽.user.ini和.htaccess⼀样是⽬录的配置⽂件,.user.ini就是⽤户⾃定义的⼀个php.ini,我们可以利⽤这个⽂件来构造后⻔和隐藏后⻔。.htaccess是Apache…

VISIO-visio2013激活工具亲测有效

如果觉得对您有帮助 还请点赞收藏,谢谢~ 通过网盘分享的文件:激活工具 链接: https://pan.baidu.com/s/1y4FDjp59CoXtcB70_q1slA?pwd=sky1 提取码: sky1