leetcode 面试经典 150 题:轮转数组
| 链接 | 轮转数组 |
|---|---|
| 题序号 | 189 |
| 题型 | 数组 |
| 解法 | 1. 额外数组法,2. 原数组翻转法(三次翻转法) |
| 难度 | 中等 |
| 熟练度 | ✅✅✅✅ |
题目
给定一个整数数组 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) 的 原地 算法解决这个问题吗?
题解
额外数组法
- 核心要点:遍历原数组,将原数组下标为 i 的元素放至新数组下标为
(i+k) mod n的位置,最后将新数组拷贝至原数组即可。 - 复杂度:时间复杂度O(n),空间复杂度O(n)。
- c++ 实现算法:
class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();vector <int> newarr(n);for(int i = 0; i < n; i++ ) {newarr[(i+k)%n] = nums[i];}nums.assign(newarr.begin(), newarr.end()); }
};
- 算法推演:
n=7,k=3
(0+3)%7=3 newarr[3] = nums[0] 1
(1+3)%7=4 newarr[4] = nums[1] 2
(2+3)%7=5 newarr[5] = nums[2] 3
(3+3)%7=6 newarr[6] = nums[3] 4
(4+3)%7=0 newarr[0] = nums[4] 5
(5+3)%7=1 newarr[1] = nums[5] 6
(6+3)%7=2 newarr[2] = nums[6] 7
原数组翻转法(三次翻转法)
- 核心要点:现将整个数组翻转,再将前 k 个数翻转,最后将剩下元素翻转。
- 复杂度:时间复杂度O(n),其中 n 为数组的长度。每个元素被翻转两次,一共 n 个元素,因此总时间复杂度为 O(2n)=O(n);空间复杂度O(1)。
- c++ 实现算法:翻转可以利用swap函数数组首尾交换实现。
class Solution2 {
public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start += 1;end -= 1;}}void rotate(vector<int>& nums, int k) {k %= nums.size(); //k=3%7=3,为了旋转不超过数组长度reverse(nums, 0, nums.size() - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.size() - 1);}
};
- 推演算法:
推演:
输入数组:1 2 3 4 5 6 7
第一次翻转:7 6 5 4 3 2 1
第二次翻转:5 6 7 4 3 2 1
第三次翻转:5 6 7 1 2 3 4
c++ 完整demo
#include <iostream>
#include <vector>using namespace std;class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();vector <int> newarr(n);for(int i = 0; i < n; i++ ) {newarr[(i+k)%n] = nums[i];}nums.assign(newarr.begin(), newarr.end()); }
};
class Solution2 {
public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start += 1;end -= 1;}}void rotate(vector<int>& nums, int k) {k %= nums.size(); //k=3%7=3,为了旋转不超过数组长度reverse(nums, 0, nums.size() - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.size() - 1);}
};
int main() {vector <int> nums = {1, 2, 3, 4, 5, 6, 7};int k = 3;//Solution solution;Solution2 solution;solution.rotate(nums, k);for(int i = 0; i < nums.size(); i++) {cout << "nums[" << i << "]: " << nums[i] << endl;}return 0;
}
相关文章:
leetcode 面试经典 150 题:轮转数组
链接轮转数组题序号189题型数组解法1. 额外数组法,2. 原数组翻转法(三次翻转法)难度中等熟练度✅✅✅✅ 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,…...
如何在 Mac 上轻松恢复语音备忘录
在 Mac 上丢失重要的语音备忘录可能会令人沮丧,但好消息是有多种方法可以恢复它们。无论您是意外删除它们还是由于系统故障而丢失,您都可以轻松地在 Mac 上恢复语音备忘录。 在本指南中,我们将探讨两种方法:在没有备份的情况下恢…...
C++ 基础概念: 未定义行为(Undefined Behavior)
文章目录 Intro如何正确认识 UB有多少未定义行为?对 UB 的误解 C 标准定义的几种行为1. 定义的行为 (defined behavior)2. 实现定义的行为 (implementation defined behavior)3. 未指定的行为 (unspecified behavior)4. 未定义行为 (undefined behavior)揭晓答案 C 中如何定义…...
Rad Studio 11.3 Alexandria 3236a(DELPHI 11.3)官方ISO/百度云盘 下载地址
Embarcadero很高兴地宣布RAD Studio 11 Alexandria Release 3的发布,也被称为RAD Studio 11.3,同时发布的还有Delphi 11.3和CBuilder 11.3。这个版本专注于质量和改进,建立在RAD Studio 11 Alexandria三个前版本的伟大的新功能上。 RAD Studi…...
vue3-watchEffect异步依赖收集
当 b 更新时 a 并不会更新,因为watchEffect的依赖收集在该案例中停止于await asyncFn(),也就是只会收集同步代码的依赖,await 之后的异步代码的依赖并不会收集到 <template> <div>a: {{ a }} <br>b: {{ b }} <br>&l…...
微信小程序中 “页面” 和 “非页面” 的区别
微信小程序中 “页面” 和 “非页面” 的区别,并用表格进行对比。 核心概念: 页面 (Page): 页面是微信小程序中用户可以直接交互的视图层,也是小程序的基本组成部分。每个页面都有自己的 WXML 结构、WXSS 样式和 JavaScript 逻辑…...
【蓝桥杯】43709.机器人繁殖
题目描述 X 星系的机器人可以自动复制自己。它们用 1 年的时间可以复制出 2 个自己,然后就失去复制能力。 每年 X 星系都会选出 1 个新出生的机器人发往太空。也就是说,如果 X 星系原有机器人 5 个,1 年后总数是:5 9 14…...
【机器学习】机器学习的基本分类-自监督学习(Self-supervised Learning)
自监督学习是一种机器学习方法,介于监督学习和无监督学习之间。它通过数据本身生成标签,创建训练任务,从而学习数据的表征,而不需要人工标注的标签。这种方法在减少标注数据依赖、提高模型通用性等方面具有重要意义。 自监督学习的…...
R shiny app | 网页应用 空格分隔的文本文件在线转csv
shiny 能快速把R程序以web app的形式提供出来,方便使用,降低技术使用门槛。 本文提供的示例:把空格分隔的txt文件转为逗号分隔的csv文件。 前置依赖:需要有R环境(v4.2.0),安装shiny包(v1.9.1)。括号内是我使用的版本…...
三天速成微服务
微服务技术栈 总结 微服务技术对比 技术栈 SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud Springboot和SpringCould兼容性 代码目录结构如下 用于远程调用Bean 代码 package cn.itcast.order.config;//import …...
【踩坑记录】uni-app 微信小程序调试不更新问题解决指南
uni-app 微信小程序调试不更新问题解决指南 在使用 uni-app 开发微信小程序时,可能会遇到代码修改后无法更新或者不生效的问题。这种现象常见于调试阶段,通常与缓存、编译或代码错误有关。 本文将详细分析调试过程中常见的“不更新”问题,并…...
【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事?
【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事? 【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事? 文章目录 【Adobe Acrobat PDF】Acrobat failed to connect to a DDE server.是怎么回事&…...
PyTorch 中 coalesce() 函数详解与应用示例
PyTorch 中 coalesce() 函数详解与应用示例 coalesce: 美 [ˌkoʊəˈlɛs] 合并;凝聚;联结,注意发音 引言 在 PyTorch 中,稀疏张量(Sparse Tensor)是一种高效存储和操作稀疏数据的方式。稀疏…...
ubuntu进行C++的调试
方法一:gdb调试 作用: GDB 是 GNU 调试器,用于调试 C/C 程序。它可以在命令行中使用,提供强大的调试功能。 集成: GDB 可以独立于 VSCode 使用,你可以在终端中直接运行 GDB 来调试程序。 使用示例:编译程序时使用 -g 选项以包含调…...
【U8+】用友U8软件中,出入库流水输出excel的时候提示报表输出引擎错误。
【问题现象】 通过天联高级版客户端登录拥有U8后, 将出入库流水输出excel的时候,提示报表输出引擎错误。 进行报表输出时出现错误,错误信息:找不到“fd6eea8b-fb40-4ce4-8ab4-cddbd9462981.htm”。 如果您正试图从最近使用的文件列…...
NoSQL简介
NoSQL 的定义及特点 NoSQL(Not Only SQL)是一种非关系型数据库,设计之初为解决关系型数据库在扩展性、性能和多样化数据处理方面的局限性。NoSQL 支持多种数据模型,包括键值对、文档、列族和图形结构,广泛应用于大规模…...
XIAO Esp32 S3 网络摄像头——3音视频监控
1、介绍 之前分别介绍了音频和视频的接收,本文是整合了前2篇文章,实现了音视频的同时获取。 效果: 用xiao esp35 s3自制一个网络摄像头 2、适用场景广泛 家庭安防 无论是门前监控,还是室内安全,自制摄像头可以让你轻松把握每个角落,实时查看视频流,防止任何潜在风险。…...
题目解析与代码实现:You‘re Given a String
引言 本文将详细解读一道字符串处理题目 “You’re Given a String”,并用 Python 实现该题的解决方案,同时解析其核心算法逻辑。本文适合有一定基础的程序员,希望通过字符串算法提升能力的读者。 1. 题目描述 问题背景 题目给出了一个字符…...
Understanding the Lomb–Scargle Periodogram
本文目的:了解Lomb–Scargle Periodogram的原理 (用来估算不均匀采样数据的周期)参考文献Understanding the Lomb–Scargle Periodogram思路: 连续傅里叶变换 --> 离散傅里叶变换(均匀采样–> Classifical perio…...
解决Linux切换用户后的命令提示符为-bashxx$的问题
1、问题描述 切换用户时,命令提示符为-bashxx$ 比如: [rootlocalhost ~]# su zhouxingchi bash-4.2$ ### 显示看着不正常的命令提示符 2、PS1变量 PS1变量就是我们的命令提示符的内容,当我们登录时会加载该变量,从而显示提…...
告别虚拟机!在Ubuntu 20.04上原生安装MATLAB 2015b的保姆级避坑指南
告别虚拟机!在Ubuntu 20.04上原生安装MATLAB 2015b的保姆级避坑指南 科研工作者和工程师们常常面临一个两难选择:既需要Linux系统的高效稳定,又离不开MATLAB这类专业计算工具。传统解决方案往往依赖虚拟机或双系统,但性能损耗和操…...
点云全局配准实战——Go-ICP从零实现与PCL集成优化
1. Go-ICP算法与点云配准基础 刚接触三维点云处理时,第一次听说"配准"这个词还以为是什么高深莫测的黑科技。其实简单来说,点云配准就是把不同视角扫描得到的点云数据对齐到同一个坐标系的过程。想象你拿着手机绕着物体拍了一圈照片ÿ…...
ALNS算法调参实战:如何让Python版VRPTW求解器效率提升50%?
ALNS算法调参实战:如何让Python版VRPTW求解器效率提升50%? 在物流优化领域,带时间窗的车辆路径问题(VRPTW)一直是算法工程师面临的经典挑战。当基础版本的ALNS算法已经能够跑通业务流程,但面对真实业务场景…...
Sketch 终极指南:Android 上最强大的图片加载库完全解析
Sketch 终极指南:Android 上最强大的图片加载库完全解析 【免费下载链接】sketch Sketch is an image loading library designed for Compose Multiplatform and Android View. It is powerful and rich in functions. In addition to basic functions, it also sup…...
AMWaveTransition扩展应用:如何适配CollectionView与其他UI组件
AMWaveTransition扩展应用:如何适配CollectionView与其他UI组件 【免费下载链接】AMWaveTransition Custom transition between viewcontrollers holding tableviews 项目地址: https://gitcode.com/gh_mirrors/am/AMWaveTransition AMWaveTransition是一款为…...
从零到一:手把手教你用国产化7K325T板卡搭建PCIe数据采集系统(含FMC子卡选型指南)
从零到一:手把手教你用国产化7K325T板卡搭建PCIe数据采集系统(含FMC子卡选型指南) 第一次拿到这块国产化7K325T板卡时,我盯着那个HPC规格的FMC接口看了半天——这个看似普通的连接器背后,藏着构建高性能数据采集系统的…...
Windows安装APK文件的最佳工具:APK Installer全面指南
Windows安装APK文件的最佳工具:APK Installer全面指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接安装安卓应用而烦恼吗&…...
如何快速搭建KCN-GenshinServer:原神一键GUI服务端完整指南
如何快速搭建KCN-GenshinServer:原神一键GUI服务端完整指南 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer KCN-GenshinServer是一款基于GC框架开发的原神一键G…...
Go语言的sync.Map中的使用
Go语言中的sync.Map是一个并发安全的键值对集合,它特别适合在高并发场景下替代传统的map加互斥锁的方案。与普通的map不同,sync.Map内部通过巧妙的机制实现了无锁读取和分段锁写入,从而在保证线程安全的同时提升了性能。对于需要频繁读取但较…...
vLLM-v0.17.1实战教程:多LoRA动态切换支持个性化Agent服务
vLLM-v0.17.1实战教程:多LoRA动态切换支持个性化Agent服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在已经发展…...
