轮转数组-三次逆置

题目

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

void rotate(int* nums, int numsSize, int k){}

示例:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

思路1

如示例所示般,一个一个地转。
先将数组最后一个元素储存到val,再将前numsSize-1个元素向后搬,最后把val的值赋给nums[0],就实现了最后一个元素放到数组开头。循环k次,就完成了轮转。

此方法效率较低,可能会超时。

void rotate(int* nums, int numsSize, int k) {//循环k次for (int i=0; i<k; i++){//数组最后一个元素储存到valint val = nums[numsSize-1];//前numsSize-1个元素向后搬for (int j=numsSize-1; j>0; j--){nums[j] = nums[j-1];}//把val的值赋给nums[0]nums[0] = val;}
}

思路2

三次逆置

示例:
输入: nums = [1,2,3,4,5,6,7], k = 3
4 3 2 1 5 6 7 前numsSize-k个逆置
4 3 2 1 7 6 5 后k个逆置
5 6 7 1 2 3 4 整体逆置

void rotate(int* nums, int numsSize, int k){//k要小于numsSizek %= numsSize;//前numsSize-k个逆置for (int i=0; i<(numsSize-k)/2; i++){int temp = nums[i];nums[i] = nums[numsSize-k-1-i];nums[numsSize-k-1-i] = temp;}//后k个逆置for (int i=0; i<k/2; i++){int temp = nums[numsSize-k+i];nums[numsSize-k+i] = nums[numsSize-1-i];nums[numsSize-1-i] = temp;}//整体逆置for (int i=0; i<numsSize/2; i++){int temp = nums[i];nums[i] = nums[numsSize-1-i];nums[numsSize-1-i] = temp;}
}

时间复杂度O(n);空间复杂度O(1)
注:

  1. 次数k如果等于0,逆置0次为没有逆置,数组不变,没有运算的必要。
  2. k要小于musSize,会有k大于等于numsSize的情况。例如:nums={-1},k=2。如果k=numsSize的话,逆置结果为原来的数组,不变,没有计算的必要。使用求余%操作使得k的取值范围为0~numsSize-1。
  3. for循环里,循环条件里需要 /2,如果时下标0~numsSize的元素逆置,当i=0时,nums[0]和nums[numsSize-1]交换;当i=numsSize-1时,nums[numsSize-1]和nums[0]交换,交换两次,结果不变。

代码改进

将交换部分封装函数reverse

void reverse(int* nums, int begin, int end)
{while (begin < end){int tmp = nums[begin];nums[begin] = nums[end];nums[end] = tmp;++begin;--end;}
}
void rotate(int* nums, int numsSize, int k)
{k %= numsSize;reverse(nums, 0, numsSize-k-1);reverse(nums, numsSize-k, numsSize-1);reverse(nums, 0, numsSize-1);
}

//3.空间换时间

开辟新空间tmp储存逆置后的数组,分别将前numsSize-k个和后k个放到tmp,因为nums是一级指针,所以直接nums=tmp没有用,要通过memcpy函数将tmp(逆置后的数组)复制给原数组

void rotate(int* nums, int numsSize, int k)
{k %= numsSize;int* tmp = (int*)malloc(sizeof(int)*numsSize);//逆置memcpy(tmp, nums+numsSize-k, sizeof(int)*k);memcpy(tmp+k, nums, sizeof(int)*(numsSize-k));//复制给原数组memcpy(nums, tmp, sizeof(int)*numsSize);//释放空间free(tmp);tmp = NULL;
}

时间复杂度O(n); 空间复杂度O(n)

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

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

相关文章

登录认证(5):过滤器:Filter

统一拦截 上文我们提到&#xff08;登录认证&#xff08;4&#xff09;&#xff1a;令牌技术&#xff09;&#xff0c;现在大部分项目都使用JWT令牌来进行会话跟踪&#xff0c;来完成登录功能。有了JWT令牌可以标识用户的登录状态&#xff0c;但是完整的登录逻辑如图所示&…

Python 网络爬虫实战:从基础到高级爬取技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 网络爬虫&#xff08;Web Scraping&#xff09;是一种自动化技术&#xff0c;利用程序从网页中提取数据&#xff0c;广泛…

MySQL锁类型(详解)

锁的分类图&#xff0c;如下&#xff1a; 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据&#xff0c;多个事务的读操作可以同时进行而不会互相影响&#xff0c;相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前&#xff0c;它会…

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中&#xff0c;date() 函数是一个非常常用的处理日期和时间的函数&#xff0c;所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…

【Rust自学】19.2. 高级trait:关联类型、默认泛型参数和运算符重载、完全限定语法、supertrait和newtype

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 19.2.1. 在trait定义中使用关联类型来指定占位类型 我们首先在第10章的10.3. trait Pt.1&a…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

web-SQL注入-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

WPS动画:使图形平移、围绕某个顶点旋转一定角度

1、平移 案例三角形如下图&#xff0c;需求&#xff1a;该三角形的A点平移至原点 &#xff08;1&#xff09;在预想动画结束的位置绘制出图形 &#xff08;2&#xff09;点击选中原始图像&#xff0c;插入/动画/绘制自定义路径/直线 &#xff08;3&#xff09;十字星绘制的直线…

xmind使用教程

xmind使用教程 前言xmind版本信息“xmind使用教程”的xmind思维导图 前言 首先xmind是什么&#xff1f;XMind 是一款思维导图和头脑风暴工具&#xff0c;用于帮助用户组织和可视化思维、创意和信息。它允许用户通过图形化的方式来创建、整理和分享思维导图&#xff0c;可以用于…

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

2025年01月27日Github流行趋势

项目名称&#xff1a;onlook项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;5340今日star数&#xff1a;211项目维护者&#xff1a;Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简介…

TCL C++开发面试题及参考答案

进程和线程的区别 进程和线程都是操作系统中重要的概念,它们在很多方面存在着明显的区别。 从概念上来说,进程是资源分配的基本单位,每个进程都有自己独立的地址空间、内存、文件描述符等资源。例如,当我们在计算机上同时运行多个应用程序,像浏览器、文本编辑器等,每个应…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

VS Code 复制正确格式的文件路径/文件夹路径 (绝对路径,相对路径, 斜杠 /, 反斜杠\\ 等)

VS Code 搜索 : baincd.copy-path-unixstyle Github : https://github.com/baincd/vscode-copy-path-unixstyle 插件市场: https://marketplace.visualstudio.com/items?itemNamebaincd.copy-path-unixstyle 支持复制各种格式的路径 格式 GitBash /c/chris/project-name/sr…

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…

python 中的堆

文章目录 小根堆的特点Python 中的 heapq 模块1. heapq.heappush(heap, item)2. heapq.heappop(heap)3. heapq.heapify(x)4. heapq.heappushpop(heap, item)5. heapq.heapreplace(heap, item)6. heapq.nsmallest(n, iterable)7. heapq.nlargest(n, iterable) 小根堆的应用场景示…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【RocketMQ】RocketMq之IndexFile深入研究

一&#xff1a;RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分&#xff1a; CommitLog&#xff1a;存储消息的元数据。所有消息都会顺序存⼊到CommitLog⽂件当中。CommitLog由多个⽂件组成&#xff0c;每个⽂件固定⼤⼩1G。以第⼀条消 息的偏移量为⽂件名。 ConsumerQue…

注解与反射基础

注解 概述 注解&#xff08;Annotation&#xff09;&#xff0c;从jdk5.0引入。 作用 不是程序本身&#xff0c;可以对程序作出解释&#xff08;这一点和注释没什么区别&#xff09;可以被其他程序读取 格式 注释是以“注释名”在代码中存在的&#xff0c;还可以添加一些…