力扣OJ题——旋转数组

题目:189.旋转数组  

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数

63d298eb5fac4db88f61a4a5c820d102.png

思路一:

1.每次挪动旋转1位(用tmp将最后一位存起来,其余所有数据向后移,然后将tmp放在第一个位置)

2.右旋k位

知道了思路的步骤,我们也先不着急实现,先来分析一下它的时间复杂度~:

我们知道每次挪动旋转1位的时间复杂度是O(N)

接下来右旋k位,这里就要分最好情况和最坏情况了:

最好情况:k是N的倍数时,我们不需要挪动,时间复杂度是O(1)

最坏情况:k%N = N-1   则要执行N*(N-1)次 时间复杂度是O(N^2)

我们知道时间复杂度是取最坏情况的

综上,思路一的时间复杂度是O(N^2)

不过这个思路博主已经在力扣上跑过了,最终超出时间限制,所以对于这道题目,时间复杂度为

O(N^2) 是不行的,我们得用其他的,时间复杂度更低的思路实现~

接下来我们来看一下思路二:

1.前n-k个逆置

2.后k个逆置

3.整体逆置

同样,我们也来分析一下它的时间复杂度,看看它的性能是否值得我们去写

简单计算得出是2*N,所以它的时间复杂度是O(N)

接下来我们就来实现一下

这里我先单独写一个逆置函数,因为这个功能我们等会要用三次, 单独写一个才更加方便之后的复用~

void Reverse(int* nums, int start, int end) //写一个逆置的函数
{while (start <end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start ++;end --;}
}

接下来我们写一下rotate函数,其实写完上面这个函数后就非常简单了:

代码如下:

void rotate(int* nums, int numsSize, int k)
{k %= numsSize;//防止越界Reverse(nums, 0, numsSize-k-1);//前n-k个逆置Reverse(nums, numsSize-k, numsSize-1);//后k个逆置Reverse(nums, 0, numsSize - 1);//整体逆置
}

这个思路就可以通过啦~

543f41a5668b42e4a2dd9fbfee109142.png

好,这是这个题的第二个思路

但是这个思路二的难点在于它怎么想出来,如果我们第一次做这类题,恐怕 还是难以下手,那么有没有我们初见就能想出来并且能过通过测试的思路呢?

所以接下来再看一下思路三~

思路三:

1.创建一个新的数组tmp

2.将原数nums后面的k个拷贝到新数组tmp前面的位置

(原数组对应下标为n-k~n-1,新数组对应下标为0~k-1)

3.将原数组nums前面的n-k个拷贝到新数组tmp后面的位置

(原数组对应下标为0~n-k-1,新数组对应下标为k~n-1)

4.将拷贝完的tmp的数据放回原数组nums中

思路有了,我们也先看一下它的时间复杂度是否可行:

先拷后k个,再拷前n-k个用了n再整体拷回,

所以总共是2*n   即时间复杂度是O(N)

既然可行,

下面来写一下代码

这里的拷贝博主直接使用memcpy函数,关于memcpy的具体用法可以在Cplusplus中搜索

这里我就大概介绍一下:

e2bf1fc19c2d4ceebf6b4f9c66cadb3b.png

从函数的定义中,我们可以看出第一个参数是目标,第二个是原,第三个参数是字节数

代码如下:

void rotate(int* nums, int numsSize, int k)
{k %= numsSize;//防止越界int tmp[numsSize];int n = numsSize;;memcpy(tmp,nums+n-k,sizeof(int)*k);memcpy(tmp+k,nums,sizeof(int)*(n-k));memcpy(nums,tmp,sizeof(int)*n);
}

然后就过了

fb3f395067774eb1ba2b3c70a9567312.png

好啦,今天的旋转数组问题就结束啦,如果文中分析,题解代码有不足的地方欢迎大家在评论区讨论和指正

让我们在接下来的时间里一起学习,一起进步吧~

c0fe1378f4b1464abb37998a472b5961.jpg

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

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

相关文章

语音唤醒——

文章目录 配置主代码 参考文档&#xff1a;https://picovoice.ai/docs/quick-start/porcupine-python/ 配置 pip install pvporcupine主代码 ACCESS_KEY&#xff1a;需要将该参数填入即可 # # Copyright 2018-2023 Picovoice Inc. # # You may not use this file except in …

数据库设计、JDBC、数据库连接池

数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求&#xff0c;结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…

WordPress站点成功升级后的介绍页地址是什么?

我们一般在WordPress站点后台 >> 仪表盘 >> 更新中成功升级WordPress的话&#xff0c;最后打开的就是升级之后的版本介绍页。比如boke112百科前两天升级到WordPress 6.4.2后显示的介绍页如下图所示&#xff1a; 该介绍除了介绍当前版本修复了多少个问题及修补了多少…

图数据库、知识图谱、装配模型

一、图数据库 图数据库简介 ​ 图数据库&#xff08;Graph Database&#xff09;是基于图论实现的一种新型NoSQL数据库。它的数据存储结构和数据的查询方式都是以图论为基础的。图论中图的基本元素为节点和边&#xff0c;在图数据库中对应的就是节点和关系。 图数据库是基于图…

Transformer——Attention 注意力机制

注意力机制 Transformer的注意力机制借鉴了人类的注意力机制。人类通过眼睛的视觉单元去扫描图像&#xff0c;其中的重点区域会被大脑的神经元处理从而获得更多的信息&#xff0c;这是人类长期精华所获得的一种能力。 以论文中的例子来看&#xff0c;红色区域表示我们人脑视觉…

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客&#xff0c;函数式编程 一.条件变量 1.概念 C条件变量&#xff08;condition variable&#xff09;是一种多线程编程中常用的同步机制&#xff0c;用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲&#xff1a; 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具&#xff0c;泛指业务软件开发&#xff0c;所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

python in Vscode

背景 对于后端的语言选择&#xff1a; python&#xff0c;java&#xff0c;JavaScript备选。 选择Python 原因&#xff1a;可能是非IT专业的人中&#xff0c;会Python的人比较多。 目的 之前使用的IDE是VSCODE&#xff0c;在WSL的环境下使用。现在需要在在WSL的VSCODE下使…

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…

51单片机编程应用(C语言):DS1302实时时钟

单片机计时的缺陷&#xff1a; 1.他的精度不高&#xff0c;没有时钟芯片精度高&#xff0c; 2.会占用单片机CPU的时间&#xff0c; 3.单片机的时钟无法掉电继续运行&#xff0c;&#xff08;最大的缺点&#xff09; DS1302芯片内部有备用电池&#xff0c;可以掉电继续计时…

算法刷题:长度最小的子数组

长度最小的子数组 .题目链接题目详情算法原理滑动窗口定义指针进窗口判断出窗口 我的答案 . 题目链接 长度最小的子数组 题目详情 算法原理 滑动窗口 这道题,我们采用滑动窗口的思想来解决,具体步骤如图所示 定义指针 如图所示,两个指针都需要从左往右进行遍历,因此初始值…