题解:轮转数组及复杂度分析

文章目录

  • 🍉前言
  • 🍉题目
    • 🍌解法一
    • 🍌解法二:以空间换时间
      • 🥝补充:memmove
    • 🍌解法三(选看)

🍉前言

本文侧重对于复杂度的分析,题解为辅。

🍉题目

在这里插入图片描述

🍌解法一

最简单的思路就是写个循环,每次移动一次,移动k次。得到如下代码:

void rotate(int* nums, int numsSize, int k) {for(int i = 0;i < k;i++) {int tmp = nums[numsSize-1];  //保存最后一个元素for(int j = numsSize-2;j >= 0;j--) {nums[j+1] = nums[j]; //从后往前覆盖}nums[0] = tmp;  //原本最后一个元素的值给到现在第一个元素}}

当你以为已经完成了,兴冲冲跑去提交的代码的时候,意外发生了:

在这里插入图片描述

啊?超时了!!!

这就涉及到时间复杂度的问题了,来分析一下上面的算法:
你可能会这样认为:外层循环走了k次,而由于numsSize是变量,把它看为n的话,就相当于内层循环跑了(n-1)次,那么总共就跑了k*(n-1)次,时间复杂度就为O(n)咯。

但是,你忽略了k,你以为它是一个常数,而它又是n的系数,就把它给忽略了。实际上k也是一个变量。按照时间复杂度取最坏的情况,我们来思考一下:每次移动一个单位,在什么情况下需要移动的次数最多?
在此我们要考虑“净轮转”,比如数组长度为6,那你往右轮转11个单位和轮转5个单位是等效的。
那显然,最坏的情况就是你轮转的k为(n-1)个单位,结合上面分析,可知时间复杂度为O(n^2)。


🍌解法二:以空间换时间

在这里插入图片描述

void rotate(int* nums, int numsSize, int k) {k %= numsSize;int* arr = (int*)malloc(sizeof(int)*numsSize);memmove(arr,nums+numsSize-k,sizeof(int)*k);memmove(arr+k,nums,sizeof(int)*(numsSize-k));memmove(nums,arr,sizeof(int)*numsSize);}

注意:这个题有个小坑,就是题干给的k没有限定范围,当k超过数组长度的时候使用memmove拷贝就会越界,所以在一开始就 k %= numsSize,这样处理后的 k 就是“净轮转”的位置
看到这里你可能想说:你上面解法一超时会不会是因为k没模numSize,移动次数太多导致超时了?确实是一部分原因,但只是特别小的一部分,更多的还是因为那个算法时间复杂度出问题。(其实我也有去试过模个numSize,可还是超时了)

不扯太远了,我们来观察一下,这个算法相比于解法一,时间复杂度降低了一一变为O(n),这就是一个很大的进步了,但是由于额外开辟一块空间,现在空间复杂度变为O(n)了(原先解法一是O(1))。这就是典型的以时间换空间,以后还会经常见到这种思想的。

🥝补充:memmove

memmove(目标地址,起始地址,拷贝的空间的大小)
若起始地址指向的空间和目标地址指向的空间有相互覆盖的部分,memmove也可以实现拷贝(虽然memcpy也可以,但我们一般还是用memmove)


🍌解法三(选看)

实际上本题还有有一个进阶的要求:要求算法空间复杂度为O(1)。
那这时候显然解法二不满足要求了。
所以有一个比较考验数学功底的解法:将要移动的和不移动的分为两部分,先将它们分别倒置,然后再整体倒置。

在这里插入图片描述
不过这种解法一般人真的很难想得到,普适性太低,所以在此不写代码演示了。

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

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

相关文章

在CARLA中获取CARLA自动生成的全局路径规划

CARLA生成全局路径规划的代码在 carla/PythonAPI/carla/agents/navigation 在自己的carla客户端py文件中 from agents.navigation.basic_agent import BasicAgent # pylint: disableimport-error 如果是pycharm开发&#xff0c;要在pycharm的Settings - Project Structure…

0003Java安卓程序设计-springboot基于Android的学习生活交流APP

文章目录 **摘** **要**目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把学习生活交流管理与现在网络相结合&#xff0c;利用java技术建设学习生活交流APP&…

1825_ChibiOS的OSLIB中的存储分配器

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 之前有点不是很理解什么是静态OS&#xff0c;从这里基本上得到了这个答案。所谓的静态&#xff0c;其实就是内核之中不会使用Free以及Malloc这样…

AoMao Editor (angular) 使用 window.print() 实现 html 导出 PDF 记录

目录 一、需求描述 二、使用 jspdf html2canvas 导出遇到的问题 三、window.print() 导出具体实现 【api: toHtml】 一、需求描述 将 AoMao Editor 富文本插件中的内容导出为PDF。 二、使用 jspdf html2canvas 导出遇到的问题 试了很多插件&#xff0c;但 angular 能用的…

Eclipse使用教程

一、前期准备 JDK环境变量得配置好&#xff08;java需要先安装好&#xff09; 【下载Eclipse解压包&#xff0c;可选择去Eclipse官网下载】 Eclipse的安装方式&#xff1a; 下载后解压直接点击进入选择工作区间就可运行 二、Eclipse基本概述&#xff1a; 工作区&#xff08;w…

JS-函数

定义方式一 定义方式二 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-函数</title> <…

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…

【数据结构】希尔排序

文章目录 前言一、希尔排序的演示图例二、希尔排序&#xff1a;插入排序的优化版本☆三、核心算法思路四、算法思路步骤&#xff08;一&#xff09;预排序 gap>1&#xff08;二&#xff09;gap1 插入排序 完成排序收尾 五、码源详解&#xff08;1&#xff09;ShellSort1 ——…

在前端实现小铃铛上展示消息

点击铃铛显示如下消息框&#xff1a; 如果点击消息&#xff0c;可以实现消息从列表中移除,并从铃铛总数上进行扣减对应的已读消息数。 关于以上功能的实现方式&#xff1a; <!-- 铃铛位置 --><i class"el-icon-bell" click"showPopover true"&…

Json工具类

工具类 package com.wego.controller;import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.goog…

UE4 Niagara Module Script 初次使用笔记

这里可以创建一个Niagara模块脚本 创建出来长这样 点击号&#xff0c;输出staticmesh&#xff0c;点击它 这样就可以拿到对应的一些模型信息 这里的RandomnTriCoord是模型的坐标信息 根据坐标信息拿到位置信息 最后的Position也是通过Map Set的号&#xff0c;选择Particles的P…

LeetCode题:83删除排序链表中的重复元素 141环形链表

83删除排序链表中的重复元素 题目内容 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xf…

STL-set和map

目录 一、pair和make_pair 1. pair 2. make_pair 二、set &#xff08;一&#xff09;set的模板参数列表 &#xff08;二&#xff09;set的构造 &#xff08;三&#xff09;set的插入 1. 测试1 2. 测试2 &#xff08;四&#xff09;low_bound和upper_bound&#xff…

【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队

在云原生领域&#xff0c;无论使用哪种编排调度平台&#xff0c;Kubernetes&#xff0c;DockerSwarm&#xff0c;OpenShift等&#xff0c;业务都需要基于镜像进行交付&#xff0c;我们在内部实践“Source-to-image”和链式构建&#xff0c;总而总结出“OneBuild”模式。 其核心…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

内网渗透-域防火墙+入站出站规则+组策略对象同步+不出网隧道上线

一.单机-防火墙-限制端口出入站-熟悉常见主机配置不出网的方式 配置防火墙属性 1.win10虚拟机本地搭建一个网站&#xff0c;配置防火墙属性的入站连接为默认值。 局域网中另一台主机能正常访问 2.入站连接设置为 阻止所有连接 。 因为是我们去访问他的网站&#xff0c;所以是入…

【JAVA学习笔记】 57 - 本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/homework 1. (1)封装个新闻类&#xff0c;包含标题和内容属性&#xff0c;提供get, set方法&#xff0c; 重写toString方法&#xff0c;打印对象时只打印标题; (2)只提供…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处&#xff0c;都有一根共地线和两根数据线。但是传递外部信息&#xff0c;串口有两根数据线可以进行双向通信&#xff0c;也就是全双工通信。而在IIC通信下&#xff0c;其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…