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

news2024/11/24 14:26:19

文章目录

  • 🍉前言
  • 🍉题目
    • 🍌解法一
    • 🍌解法二:以空间换时间
      • 🥝补充: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.coloradmin.cn/o/1173786.html

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

相关文章

02-React组件与模块

组件与模块 前期准备 安装React官方浏览器调试工具&#xff0c;浏览器扩展搜索即可 比如红色的React就是本地开发模式 开启一个用React写的网站&#xff0c;比如美团 此时开发状态就变成了蓝色 组件也能解析出来 何为组件&模块 模块&#xff0c;简单来说就是JS代…

亚马逊云科技大语言模型下的六大创新应用功能

目录 前言 亚马逊云科技的AI创新应用 ​编辑 Amazon CodeWhisperer Amazon CodeWhisperer产品的优势 更快地完成更多工作 自信地进行编码 增强代码安全性 使用收藏夹工具 自定义 CodeWhisperer 以获得更好的建议 如何使用Amazon CodeWhisperer 步骤 1 步骤 2 具体…

php7.4.32如何快速正确的开启OpenSSL扩展库,最简单的办法在这里!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

GNU ld链接器 lang_process()(二)

一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…

PS Raw中文增效工具Camera Raw 16

Camera Raw 16 for mac&#xff08;PS Raw增效工具&#xff09;的功能特色包括强大的图像调整工具。例如&#xff0c;它提供白平衡、曝光、对比度、饱和度等调整选项&#xff0c;帮助用户优化图像的色彩和细节。此外&#xff0c;Camera Raw 16的界面简洁易用&#xff0c;用户可…

每日一题 187. 重复的DNA序列(中等)

由于今天做了周赛&#xff0c;每日一题就简单点直接暴力哈希 class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:d defaultdict(int)ans []for i in range(len(s) - 9):t s[i: i 10]d[t] 1if d[t] 2:ans.append(t)return ans

CCC数字钥匙设计【NFC】 --通过NFC进行车主配对Phase4

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase4进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…

凸优化问题(最简单)

一、凸优化问题 1.1 概念 凸优化问题minf(x)&#xff1a;需要同时满足两个条件&#xff1a;变量可行域时凸的(convex)&#xff1b;目标函数也是凸函数(convex)。 &#xff08;1&#xff09;变量x的可行域Ω为凸集&#xff0c;即对于集合Ω中任意两点x1、x2∈Ω&#xff0c;他…

使用阿里云服务器,httplib库在listen过程中,出现Cannot assign requested address错误???

今天&#xff0c;在做一个小项目的时候&#xff0c;使用httplib库进行建立tcp连接&#xff0c;但是一旦程序开始&#xff0c;并没有等待tcp连接的到来&#xff0c;而是直接结束了。 打印一下strerror(errno) 根本就没有进行客户端的连接。 找了一下午&#xff0c;检测是否…

SEO优化的好帮手,5个必备的好工具

做海外市场的企业&#xff0c;谷歌SEO是一个非常重要的方式&#xff0c;帮助提高自己企业的网站曝光&#xff0c;起着至关重要的作用&#xff0c;因为人们普遍会通过网上搜索来找到那些适合的商品&#xff0c;与排名靠后的公司相比&#xff0c;出现在搜索结果顶部的公司往往能吸…

有人物联网模块连接阿里云物联网平台的方法

摘要&#xff1a;本文介绍有人物联网模块M100连接阿里云的参数设置&#xff0c;作为说明书的补充。 没有阿里云功能需求的请略过本文&#xff0c;不要浪费您宝贵的时间。 网络选择LTE&#xff0c;请先确保插入的SIM卡有流量。 接下来配置阿里云云服务。如下图所示&#xff0c;…

802.11 CSMA/CA协议

《计算机网络自顶向下》P351的总结提炼

Linux应用开发基础知识——交叉编译与gcc编译(一)

前言&#xff1a; 源文件需要经过编译才能生成可执行文件。在 Windows 下进行开发时&#xff0c;只需 要点几个按钮即可编译&#xff0c;集成开发环境(比如 Visual studio)已经将各种编译 工具的使用封装好了。Linux 下也有很优秀的集成开发工具&#xff0c;但是更多的时候是 直…

x264交叉编译(ubuntu+arm)

1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压&#xff1b;复制到ubuntu&#xff1b; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…

Vue3.0 路由

简介 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。功能包括&#xff1a; 嵌套路由映射动态路由选择模块化、基于组件的路由配置路由参数、查询、通配符展示由 Vue.js 的过渡系统提供的过渡效果细致的导航控…

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…

算法题:144.二叉树的前序遍历(递归、迭代)Java Python部分

1、递归法 其实递归法提交结果也挺好看的&#xff0c;代码如下&#xff1a; class Solution {//前序遍历public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>();preorder(root, res);return res;}public vo…

木马捆绑+签名修改(CobaltStrike免杀)

今天我们就来聊一下什么是捆绑木马,说起捆绑木马我相信一些人肯定觉得很陌生。在日常中我相信大家经常可能会遇到这样的一个问题,在一些网站上下载一个电脑软件结果电脑上就被莫名其妙的安装上了一个全家桶(流氓软件)。这就是通过简单的捆绑技术将一些你不需要的广告软件安…

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…