Leetcode 189: 轮转数组
Leetcode 189: 轮转数组
这是一道经典问题,题目要求将一个数组向右轮转 k 个位置,有多种解法可以快速求解,既可以通过额外空间,也可以在 O(1) 的空间复杂度内完成。本题考察数组操作、双指针,以及算法优化能力。
题目描述
输入:
- 一个整数数组
nums - 一个整数
k(表示右移的次数)。
输出:
- 将数组元素旋转
k次后直接修改原数组,不返回值。
示例输入输出:
输入:nums = [1,2,3,4,5,6,7], k = 3
输出:[5,6,7,1,2,3,4]输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解法 1:额外数组辅助
思路
- 使用一个额外的数组
temp来保存最终的旋转结果。 - 拷贝操作:
- 遍历原数组,将
nums[i]放置到新位置(i + k) % n中。
- 遍历原数组,将
- 覆盖结果:
- 将
temp中的内容转存回原数组。
- 将
代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,需要取模int[] temp = new int[n];for (int i = 0; i < n; i++) {temp[(i + k) % n] = nums[i]; // 按照旋转后的位置存储}// 将 temp 的内容拷贝到原数组for (int i = 0; i < n; i++) {nums[i] = temp[i];}}
}
复杂度分析
- 时间复杂度:O(n)
- 遍历数组两次,一次构造
temp数组,一次拷贝回原数组。
- 遍历数组两次,一次构造
- 空间复杂度:O(n)
- 需要一个额外大小为
n的数组存放临时结果。
- 需要一个额外大小为
解法 2:环状替换
思路
- 核心观察:
- 通过旋转,数组中的每个元素其实沿着环状路径被移动,例如第
i个元素移动到位置(i + k) % n。 - 从某个点出发,将该点开始的所有元素按照这种环状方式重新排列。
- 当访问过的元素数量达到数组大小
n时,正好完成所有元素的轮转。
- 通过旋转,数组中的每个元素其实沿着环状路径被移动,例如第
- 实现步骤:
- 统计当前访问过的元素数量
count,从未访问过的某个起始点出发进行 “环绕替换”。 - 对于每个元素,将其移至新位置
(i + k) % n,直到形成一个环,然后跳到下一个未访问的点。
- 统计当前访问过的元素数量
代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,取模去掉多余轮转int count = 0; // 记录访问的元素数量for (int start = 0; count < n; start++) { // 从未访问的点开始int current = start; // 当前节点int prev = nums[start]; // 保存当前值do {int next = (current + k) % n; // 下一个位置int temp = nums[next]; // 保存下个位置的值nums[next] = prev; // 替换值prev = temp; // 更新 "前一个值"current = next; // 跳到下一个位置count++; // 更新访问数量} while (current != start); // 环绕回起点时退出}}
}
复杂度分析
- 时间复杂度:O(n)
- 每个元素最多被访问一次。
- 空间复杂度:O(1)
- 没有使用额外数据结构,原地旋转。
解法 3:数组翻转技巧
思路
- 数组轮转可以通过 三步翻转 实现:
- 第 1 步:翻转整个数组;
- 第 2 步:翻转前
k个元素; - 第 3 步:翻转后
n-k个元素。
- 实现原理:
- 经过数组翻转操作后,元素将被正确排列。
- 例如:对于输入
nums = [1,2,3,4,5,6,7],k=3:原始: [1, 2, 3, 4, 5, 6, 7] 步骤 1 翻转整个数组: [7, 6, 5, 4, 3, 2, 1] 步骤 2 翻转前 k 个元素:[5, 6, 7, 4, 3, 2, 1] 步骤 3 翻转后 n-k 个元素:[5, 6, 7, 1, 2, 3, 4]
代码模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于数组长度,取模处理// 翻转函数reverse(nums, 0, n - 1); // 翻转整个数组reverse(nums, 0, k - 1); // 翻转前 k 个元素reverse(nums, k, n - 1); // 翻转后 n-k 个元素}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(k) 和 O(n-k),总时间为 O(n)。
- 空间复杂度:O(1)
- 翻转操作原地完成,没有额外数据结构。
解法 4:双指针 + 循环节
思路
- 使用双指针从两端到中间进行元素筛选调整。
- 或者结合环状数组的位置动态安排记录。
总结:如何快速 AC?
- 优先选择三步翻转解法:O(n) 时间复杂度,O(1) 空间复杂度,实现简单,效率最高,是面试中优先推荐的解法。
- 针对特殊场景:
- 如果原数组不可修改,可以选择额外数组解法。
- 如果需要一定技巧性(如比特运算分析竞赛题),环状替换法更具逻辑挑战。
- 边界情况注意:
k大于数组长度时,需要取模:k %= n。- 空数组或
k=0时,直接返回。
通过掌握以上 3 种高效解法(特别是三步翻转技巧),不仅可以轻松解决问题,还能给面试官留下深刻印象。
相关文章:
Leetcode 189: 轮转数组
Leetcode 189: 轮转数组 这是一道经典问题,题目要求将一个数组向右轮转 k 个位置,有多种解法可以快速求解,既可以通过额外空间,也可以在 O(1) 的空间复杂度内完成。本题考察数组操作、双指针,以及算法优化能力。 题目…...
使用vue3+element plus 的table自制的穿梭框(支持多列数据)
目录 一、效果图 二、介绍 三、代码区 一、效果图 话不多说,先上图 二、介绍 项目需要:通过穿梭框选择人员信息,可以根据部门、岗位进行筛选,需要显示多列(不光显示姓名,还包括人员的一些基础信息&…...
Java【多线程】(2)线程属性与线程安全
目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入(如何自己实现可重入锁) 2.4.4死锁(三种情况) 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…...
后端-Java虚拟机
Java虚拟机 Java虚拟机的组成 Java虚拟机的组成由类加载器ClassLoader、运行时数据区域(JVM管理的内存)和执行引擎(即时遍历器、解释器垃圾回收器) 类加载器加载class字节码文件中的内容到内存运行时数据区域负责管理jvm使用到…...
vue These dependencies were not found
These dependencies were not found: * vxe-table in ./src/main.js * vxe-table/lib/style.css in ./src/main.js To install them, you can run: npm install --save vxe-table vxe-table/lib/style.css 解决: nodejs执行以下语句 npm install --save vxe-t…...
Yak 在 AI 浪潮中应该如何存活?
MCP 是 Claude 发起的一个协议,在2024年10月左右发布,在2025年2月开始逐步有大批量的 AI 应用体开始支持这个协议。这个协议目的是让 AI 同时可以感知有什么工具可以用,如果要调用这些工具的话,应该是用什么样的方式。 这个 MCP 协…...
AI是否能真正理解人类情感?从语音助手到情感机器人
引言:AI与情感的交集 在过去的几十年里,人工智能(AI)的发展速度令人惊叹,从简单的语音识别到如今的深度学习和情感计算,AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域,AI不…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
linux上面安装 向量数据库 mlivus和 可视化面板Attu
1. 确保docker(docker 19.0以上即可) 和 docker-compose(V2.2.2以上) 都已安装 2. 创建milvus工作目录 # 新建一个名为milvus的目录用于存放数据 目录名称可以自定义 mkdir milvus# 进入到新建的目录 cd milvus 3. 下载并编辑docker-compose.yml 在下载…...
虚拟机ip设置
打开上次安装的虚拟机,左上角编辑/虚拟网络编辑器 改地址 地址要看自己电脑情况配置,我这是学校电脑 都是配一样的 然后改虚拟网卡 改和刚刚一样的 是改ipv4 然后启动虚拟机 输入vi /etc/sysconfig/network-scripts/ifcfg-ens33 使用vi编辑器修改其中…...
用工厂函数简化redis配置
工厂函数(Factory Function)不同于构造函数,工厂函数就是一个普通函数,通常用于创建对象或实例。它的核心思想是通过一个函数来封装对象的创建逻辑,而不是直接使用类的构造函数。工厂函数可以根据输入参数动态地决定创…...
类和对象-继承-C++
1.定义 面向对象的三大特征之一,为了减少重复的代码 2.语法 class 子类 :继承方式 父类 (子类也叫派生类,父类也称为基类) 例:class age:public person; #include<iostrea…...
使用Maven搭建Spring Boot框架
文章目录 前言1.环境准备2.创建SpringBoot项目3.配置Maven3.1 pom.xml文件3.2 添加其他依赖 4. 编写代码4.1 启动类4.2 控制器4.3 配置文件 5.运行项目6.打包与部署6.1 打包6.2 运行JAR文件 7.总结 前言 Spring Boot 是一个用于快速构建 Spring 应用程序的框架,它简…...
RockyLinux 为 k8s 集群做准备
1.准备VM 镜像 开启虚拟机 选择安装 Rocky linux 9.5 软件选择最小安装就可以了 在 rocky 9 以后版本中 他全部 采用 network manager 去替换老的 network 去实现网络的管理 1.网卡配置 cat /etc/NetworkManager/system-connections/ens160.nmconnection 我们配置了两块网…...
安卓基础组件Looper - 02 native层面的剖析
文章目录 native使用使用总结创建Looper构造函数创建(不推荐)使用举例源代码 Looper::prepare 获取Looper可忽略初始化Looper主动休眠 pollAll主动唤醒 wake 发送消息 sendMessage轮询消息 native使用 Android Native Looper 机制 - 掘金 (juejin.cn) /system/core/libutils/…...
用大白话解释搜索引擎Elasticsearch是什么,有什么用,怎么用
Elasticsearch是什么? Elasticsearch(简称ES)就像一个“超级智能的图书馆管理系统”,专门帮你从海量数据中快速找到想要的信息。它底层基于倒排索引技术(类似书籍的目录页),能秒级搜索和分析万…...
机器学习的三个基本要素
机器学习的基本要素包括模型、学习准则(策略)和优化算法三个部分。机器学习方法之间的不同,主要来自其模型、学习准则(策略)、优化算法的不同。 模型 机器学习首要考虑的问题是学习什么样的模型(Model&am…...
二十三种设计模式
2 工厂方法模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通…...
Spring Boot 异步编程深入剖析
Spring Boot 异步编程深入剖析 1. 异步方法的使用 原理深度解析 Spring Boot 的异步方法基于 Spring 的 AOP(面向切面编程)实现。当在方法上添加 Async 注解时,Spring 会为该方法所在的类创建一个代理对象。当调用该异步方法时,…...
SqlSugar 语法糖推荐方式
//方式1:var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2:不推荐使用,建议优先使用 Lambda 表达式,因为它更…...
SQL 全面指南:从基础语法到高级查询与权限控制
SQL:全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。 一、SQL通用语法 在学习具体的SQL语句之前,先来了解一下SQL语言的同于语法。 1). SQL语句可以单行或多…...
Spring Cloud Gateway 网关的使用
在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…...
【Spring Cloud Alibaba】基于Spring Boot 3.x 搭建教程
目录 前言一、开发环境二、简介 1.主要功能2.组件 三、搭建过程 1 - 主体工程搭建2 - 服务注册与发现组件 —— Nacos的安装3 - 服务注册与发现 —— 服务提供者4 - 服务注册与发现 —— 服务消费者5 - 服务配置中心6 - OpenFeign服务接口调用7 - OpenFeign高级特性8 - Spring…...
JavaWeb-jdk17安装
下载jdk17 地址:https://www.oracle.com/java/technologies/downloads/#jdk17-windows 安装jdk 配置环境变量 右键点击我的电脑>属性>高级系统设置>环境变量 在系统变量Path变量中添加 测试 java -version javac -version...
docker关闭mysql端口映射的使用
需求 项目中的数据库为mysql,如果将端口映射到宿主机上,容易被工具扫描出,且随着国产化的进程推进,mysql将不被允许。为了提高安全性与满足项目需求,这里采用隐藏mysql端口方式,不映射宿主机端口ÿ…...
【银河麒麟高级服务器操作系统】服务器测试业务耗时问题分析及处理全流程分享
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
算法1-4 蜜蜂路线
题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m 开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n−…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
数据库原理SQL查询(习题+知识点)
一、查询学生表所有学生记录 1.题目内容代码编写 select * from stu; 2.知识点提醒 1)选择表中的所有属性列有两种方法 在select关键字后列出所有列名若列的显示顺序与其在表中的顺序相同,则也可用 * 表示所有列 二、查询学生表中部分信息 1.题目内…...
安路FPGA开发入门:软件安装与点灯与仿真(TangDynasty ModelSim)
文章目录 前言软件安装开发软件仿真软件 点灯测试代码编写与编译引脚分配固件下载 仿真测试ModelSim添加仿真库TangDynasty仿真设置进行仿真 后记 前言 最近因为工作需要用安路的FPGA,这里对安路FPGA开发相关流程做个记录。作为测试只需要一个核心板(我这…...
