【数据结构OJ题】轮转数组

原题链接:https://leetcode.cn/problems/rotate-array/

目录

1. 题目描述

2. 思路分析

3. 代码实现


1. 题目描述

2. 思路分析

1. 方法一暴力求解,将数组的第一个元素用临时变量tmp存起来,再将数组其他元素往右挪动一步,挪动k次。

时间复杂度:O(N^2)

空间复杂度:O(1)

2. 方法二空间换时间,用malloc()函数额外开辟一个空间表示tmp[ ]数组。将原数组nums[ ]中的后k个元素拷贝到tmp[ ]数组,作为tmp[ ]数组前k个元素。将原数组的前n-k个元素拷贝到tmp[ ]数组,作为tmp[ ]数组的后n-k个元素。最后再将tmp[ ]数组拷贝回去给原数组nums[ ]。(拷贝的操作我们要使用memcpy()函数)

时间复杂度:O(N)

空间复杂度:O(N)

3. 方法三三次逆置首先将前n-k个元素逆置,将后k个元素逆置,最后将数组整体逆置。

(也可以先将数组整体逆置,然后将数组前k个元素逆置,将后n-k个元素逆置)。

时间复杂度:O(N)

空间复杂度:O(1)

3. 代码实现

因为方法一的时间复杂度太高了,这里就不写出来了。我们在这里实现方法二和方法三的代码。

这里都要注意一个问题,就是k的值有可能大于等于数组长度n,所以我们要做取余操作k%=n来防止越界。

这里先介绍下方法二要用到的内存相关的函数:

malloc函数是用于动态分配内存的函数。malloc函数的作用是在运行时从堆中分配指定大小的内存块,并返回一个指向该内存块的指针。

函数参数size表示需要分配的内存块的大小,以字节为单位。malloc函数返回一个void*类型的指针,指向分配的内存块的起始位置。如果内存分配失败,则返回一个空指针NULL

使用malloc函数可以动态地在程序运行期间申请所需的内存空间来存储数据,而不需要在编译时确定内存大小。分配的内存块可以用于存储各种类型的数据(如整数、字符、数组等)。

 memcpy函数用于在内存之间复制一段数据。memcpy函数将指定大小的数据从源内存区域复制到目标内存区域。memcpy函数返回一个指向目标内存区域的指针。

函数参数:

dest:指向目标内存区域起始位置的指针。

src:指向源内存区域起始位置的指针。

num:需要复制的字节数。

方法二:

void rotate(int* nums, int numsSize, int k) {int n = numsSize;int* tmp = malloc(sizeof(int) * n);  //用malloc()函数开辟一块空间k %= n; //防越界memcpy(tmp, nums + n - k, sizeof(int) * k);  //将nums[]数组的后k个拷贝到tmpmemcpy(tmp + k, nums, sizeof(int) * (n - k));  //将nums[]数组的前n-k个拷贝到tmpmemcpy(nums, tmp, sizeof(int) * n);  //将tmp[]数组拷贝给nums[]free(tmp);tmp = NULL;
}

方法三:

void reverse(int* nums, int left, int right)
{while (left < right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;++left;--right;}
}
void rotate(int* nums, int numsSize, int k) {int n = numsSize;k %= n;  //防越界reverse(nums, 0, n - k - 1);  //逆置前n-k个reverse(nums, n - k, n - 1);  //逆置后k个reverse(nums, 0, n - 1); //整体逆置
}

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

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

相关文章

SpringBoot+MyBatis多数据源配置

1.先在配置文件application.yml中配置好数据源 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedb1:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootjdbc-url: jdbc:mysql://192.168.110.128:3306/CampusHelp?useUnicodeyes&…

基于dockerfile构建sshd、httpd、nginx、tomcat、mysql、lnmp、redis镜像

一、镜像概述 Docker 镜像是Docker容器技术中的核心&#xff0c;也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行&#xff0c;在Docker的整个使用过程中&#xff0c;进入一个已经定型的容器之后&#xff0c;就可以在容器中进行操作&#xff0c;最常见的…

【深度学习】Collage Diffusion,拼接扩散,论文,实战

论文&#xff1a;https://arxiv.org/abs/2303.00262 代码&#xff1a;https://github.com/VSAnimator/collage-diffusion 文章目录 AbstractIntroductionProblem Definition and Goals论文其他内容实战 Abstract 基于文本条件的扩散模型能够生成高质量、多样化的图像。然而&a…

CentOS 7中,配置了Oracle jdk,但是使用java -version验证时,出现的版本是OpenJDK,如何解决?

1.首先&#xff0c;检查已安装的jdk版本 sudo yum list installed | grep java2.移除、卸载圈红的系统自带的openjdk sudo yum remove java-1.7.0-openjdk.x86_64 sudo yum remove java-1.7.0-openjdk-headless.x86_64 sudo yum remove java-1.8.0-openjdk.x86_64 sudo yum r…

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

第二篇|研究数据哪里来——建筑业

数据是研究和产业发展的重要基石&#xff0c;然而无论是学者、企业还是研究机构往往都面临着“找数据难”的局面。本期将分享一些查找建筑相关的数据及资料的渠道。希望可以帮大家解决这一难题&#xff0c;有用求收藏求收藏求收藏~ 1.政府机构 可以查找国家、地方政府的建筑行…

65 # 实现 http-server 里的 gzip 压缩

用 zlib 来实现 gzip 压缩 服务端优化都是&#xff1a;压缩 缓存 前端可以通过 webpack 插件进行压缩 gzip 根据替换来实现的&#xff0c;重复率越高&#xff0c;压缩后的结果越小 const zlib require("zlib"); const fs require("fs"); const path …

自己实现Linux 的 cp指令

cp指令 Linux的cp指令就是复制文件&#xff1a; cp: 拷贝(cp 拷贝的文件 要拷贝到的地址或文件)&#xff0c;cp b.c test.c 将b.c拷成test.c的一个新文件 Linux 系统初识_mjmmm的博客-CSDN博客 实现思路 打开源文件读文件内容到缓冲区创建新文件将读到的文件内容全部写入新文…

React 在 html 中 CDN 引入(包含 antd、axios ....)

一、简介 cdn 获取推荐 https://unpkg.com&#xff0c;unpkg 是一个快速的全球内容交付网络&#xff0c;适用于 npm 上所有内容。 【必备】react 相关 cdn。附&#xff1a;github 官方文档获取、现阶段官方文档 CDN 网址。 <script crossorigin src"https://unpkg.com…

用spinal写《自己动手写cpu》中的代码--pc_reg模块

一 预期代码 二 spinal代码 package oriimport spinal.core._class pc_reg(width: Int) extends Component{val io = new Bundle {val pc = out UInt(width bits)val ce = out UInt (1 bits)val clk = in Bool()val rst = in Bool()}val ceClkDomain = ClockDomain(clock = i…

c#设计模式-行为型模式 之 观察者模式

定义&#xff1a; 又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能够自 …

怎么绘制汤姆索亚历险记思维导图?掌握这几个绘制步骤就可以

怎么绘制汤姆索亚历险记思维导图&#xff1f;如果你正在为学习汤姆索亚历险记而感到困惑&#xff0c;或者你想要更好地理解小说中的人物关系、情节和舞台背景&#xff0c;那么一个清晰的思维导图就可以帮助你梳理思路。那么下面就给大家介绍一下绘制步骤。 在进行思维导图绘制的…