【面试经典150 | 数组】轮转数组

news2024/11/23 11:08:50

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:使用额外的数组
    • 方法二:翻转数组
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【翻转数组】【数组】


题目来源

面试经典150题 | 189. 轮转数组


题目解读

题目意思很明确,将给定的数组 nums 向右轮转 k 个位置,所谓的轮转,就是将数字向右移动,超出数组了就从数组头部继续轮转。


解题思路

方法一:使用额外的数组

一种比较容易想到的方法就是,借助一个额外的数组 newArr 存储轮转后的结果。原数组位置 i 的元素,移动后的位置应该是 (i + k) % n,其中 n 是数组的长度。

最后,需要将数组 newArr 中元素放置回 nums

实现代码

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
		int m = nums.size();
		vector<int> newArr(m);
		for (int i = 0; i < m; i++) {
			int index = (i + k) % m;
			newArr[index] = nums[i];
		}
		nums.assign(newArr.begin(), newArr.end());
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),因为只需要一次遍历。

空间复杂度: O ( n ) O(n) O(n),额外的数组长度为 n

方法二:翻转数组

当我们把数组的元素向右移动 k 次后,尾部的 k mod n 个元素会移动到数组的头部,其余元素会向后移动 k mod n 个位置。比如数组 nums = [1, 2, 3, 4, 6]k = 3,尾部的三个元素 3, 4, 6 移动到数组头部,元素 1, 2 向后依次移动了三个位置。

于是,我们可以先翻转原数组 nums,这样尾部的 k mod n 个元素会移动到数组的头部,但是是翻转的,因此需要再翻转回来,翻转的区间为 [0, k mod n - 1]。原来剩下的元素经过第一个翻转向后移动了 k mod n 个位置,但是是翻转的,因此需要再翻转回来,翻转的区间为 [k mod n, n - 1]

我们还是以 数组 nums = [1, 2, 3, 4, 6]k = 3 为例,利用图解的方式来说明翻转过程。

(1) 原数组 nums 如下所示;

(2)翻转数组 nums

(3)翻转前 k mod n 个元素;

(4)翻转剩下的元素。

经过以上三次翻转,顺利完成数组的轮转。

实现代码

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k %= nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin() + k, nums.end());
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度,使用了三次的 reverse() 看似是常数时间,实则每次翻转背后的时间复杂度均为 O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全是什么?手把手教你认识网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。 &#xff08;1&#xff09;基本特征 网络安全根据其本质的界定&#…

怎样用图片去搜索商品呢?

taobao.item_search_img 为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个taobao应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载taobaoAPI的SDK并掌握基本的API基础知识和…

博客数量为啥产出少了呢

如题博客数量为啥产出少了 gpt出来了之后大部分问题都可以通过gpt搜索到结果了,慢慢的就养成习惯了,很容易知道结果的东西就不想记录下来了,这获取就是人类的惰性吧,哈哈哈,越容易获取越不珍惜 提出几个问题 1. gpt是通过我们大家写的博客和大量文档学习出来的,如果大家都不…

PMP第七版考试该怎么学?

第七版怎么学习&#xff0c;建议报个培训班&#xff0c;第七版比第六版更加难以理解&#xff0c;除非专业人士&#xff0c;真的想一个人啃完难度很大。 想自学的话&#xff0c;可以建议学习第六版加敏捷的内容&#xff0c;考纲就是这两部分的内容。 考试占比参考&#xff08;2…

初识Linux操作系统

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 本次内容&#xff0c;我们主要了解一下Linux的发展历史。 目录 Linux 背景介绍 发展史 操作系统的兴起 第一个操作系统——Unix Linux的发展史 开源 Linux官网 企业应用现状 发行版本 Linux 背景介绍 发展史 …

《低代码指南》——Airtable再裁员27% 低代码市场生变?

继去年年底裁员254人后,低代码平台提供商Airtable宣布在九个月内进行第二轮237人裁员,约占公司员工的27%,旨在实现公司“现金流为正”。 Airtable首席执行官Howie Liu接受福布斯采访透露,裁员是公司专注于赢得大型企业客户和控制支出计划的一部分,也是该公司在疫情期间经…

【LeetCode-中等题】150. 逆波兰表达式求值

文章目录 题目方法一&#xff1a;栈 题目 方法一&#xff1a;栈 class Solution {public int evalRPN(String[] tokens) {Deque<Integer> deque new LinkedList<>();String rpn "-*/";//符号集 用来判断扫描的是否为运算符int sum 0;for(int i 0 ; i…

JDK18特性

文章目录 JAVA18概述1. 默认UTF-8字符编码2. 简单的Web服务器3.JavaDoc的增强4. 反射功能的新特性5.Vector API(三次孵化)6. 互联网地址解析SPI7. 外部函数和内存API(二次孵化)8.switch 表达式 JAVA18概述 Java 18 在 2022 年 3 月 22 日正式发布&#xff0c;Java 18 不是一个…

简单的手机电脑无线传输方案(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server abstract windows访问android文件 android访问桌面系统上的文件 windows浏览android文件 环境准备 客户端软件 android手机…

引导加载程序

引导加载程序概览 引导加载程序是供应商专有的映像&#xff0c;负责在设备上启动内核。引导加载程序会监护设备状态&#xff0c;负责初始化可信执行环境 (TEE) 以及绑定其信任根。引导加载程序还会在将执行工作移到内核之前先验证 boot 和 recovery 分区的完整性。 引导加载程…

京都大学利用 CNN 预测粮食产量,丰收不问天,问 AI 就够了

联合国预测&#xff0c;2050 年世界人口预计达到 91 亿&#xff0c;全球对粮食的需求量将增加 70%。然而&#xff0c;由于世界农业发展不均衡&#xff0c;很多地区的粮食产量尚无法被准确统计&#xff0c;因此无法对这些区域的农业发展做出合理规划。现有的粮食产量统计方法则难…

项目进度管理(3-3)PERT计划评审技术 理论和实践详解

1 计划评审技术起源 PERT&#xff08;Program Evaluation and Review Technique&#xff0c;项目评估和审查技术&#xff09;的起源可以追溯到20世纪50年代&#xff0c;与美国国防部和美国海军的项目管理有关。 PERT的发展始于20世纪50年代初&#xff0c;当时美国国防部正面临…

苹果笔不用原装可以吗?好用的平板触控笔

由于Apple pencil的出世&#xff0c;给许多小伙伴带了很高的生产效率。但Apple pencil的昂贵&#xff0c;让许多小伙伴连连劝退&#xff0c;觉得只是偶尔写字&#xff0c;没有必要入手一支这么昂贵的笔&#xff0c;咱们国内也会很多做得相当不错的平替电容笔&#xff0c;但很多…

java反序列化---URLDNS链

目录 一、前言 二、原理分析 三、代码实现 一、前言 URLDNS链相较于其他java反序列化链是比较简单的&#xff0c;只需要几步调用就能触发 所以学习java反序列化&#xff0c;最好从URLDNS链出发&#xff0c;初步了解如何跟进&#xff0c;以及反射获取类、方法等 使用这条链…

『PyQt5-Qt Designer篇』| 10 Qt Designer中控件的尺寸相关设置(sizePolicy策略)

10 Qt Designer中控件的尺寸相关设置(sizePolicy策略) 1 设置控件尺寸1.1 查看最大和最小尺寸1.2 设置最大和最小尺寸2 期望尺寸2.1 期望尺寸2.2 获取期望尺寸3 sizePolicy(尺寸策略)3.1 简介3.2 属性值4 示例1 设置控件尺寸 1.1 查看最大和最小尺寸 默认情况下控件的最大值…

Java集合之HashSet接口

Set Set接口、HashSet类、TreeSet类 Set&#xff08;组、集&#xff09;&#xff1a;表示无序&#xff0c;元素不能重复的集合&#xff0c;组中的元素必须唯一 Set接口 Set接口定义了组/集/集合&#xff08;Set&#xff09;。他扩展了Collection接口&#xff0c;并声明了不允…

华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明核心算法&#xff1a;按照二进制加法计算&#xff0c;并且不计算进位。但是&#xff0c;B希望在满足A的情况下获取苹果重量最多。 华为OD机试 2023B卷题库疯狂…

企业架构LNMP学习笔记51

企业案例使用&#xff1a; 主从模式&#xff1a; 缓存集群结构示意图&#xff1a; 去实现Redis的业务分离&#xff1a; 读的请求分配到从服务器上&#xff0c;写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

wordpress使用category order and taxonomy terms order插件实现分类目录的拖拽排序

文章目录 引入实现效果安装插件使用插件 引入 使用docker快速搭建wordpress服务&#xff0c;并指定域名访问 上一节我们使用docker快速搭建了wordpress服务&#xff0c;可以看到基础的wordpress服务已经集成基础的用户管理、文章发布、页面编辑、文章分类等功能&#xff0c;但…

某验3空间推理验证码破解

geetest极验空间推理验证码破解 > 本篇文章仅供学习使用&#xff0c;如侵权请联系删除。某验验证码3代&#xff0c;4代已经是老生常谈的问题了&#xff0c;本篇文章粗略的分析一波3代空间推理验证码识别与验证的整个过程。 yolov识别坐标 1.参数破解 从一开始gt和challen…