力扣OJ题——旋转数组

news2025/3/12 13:43:13

题目: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.coloradmin.cn/o/1453854.html

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

相关文章

什么是VDA 4902?

VDA 4902为条码运输标签&#xff0c;主要为企业制作条码运输标签提供参考和标准。 运输标签唯一标识内部物料流以及货物供应商、货运代理和收货人之间运输中的运输方式和载货人。因此&#xff0c;所有供应商必须确保所有运输工具和载货架都带有符合 VDA 标准下 4902 第 4 版&a…

恢复被.target勒索病毒加密的数据文件:拒绝向.target勒索病毒支付赎金

引言&#xff1a; 在当今数字时代&#xff0c;勒索病毒已成为网络安全领域的一大威胁&#xff0c;而.target勒索病毒是其中引起广泛关注的一种变种。本文将深入探讨.target勒索病毒的特点以及被其加密的数据文件恢复方法。数据的重要性不容小觑&#xff0c;您可添加我们的技术…

用Python和OpenCV搭建自己的一维码和QRCode扫描仪(步骤 + 源码)

导 读 本文主要介绍使用Python和OpenCV搭建自己的一维码和QRCode扫描仪&#xff08;步骤 源码&#xff09;。 项目简介 本文我们将创建一个程序来扫描图像中的二维码和条形码。对于这个程序&#xff0c;我们需要三个包&#xff0c;分别是OpenCV、NumPy和pyzbar。大多数 Pyth…

linux搭建测试环境详细过程

前言 本文记录下&#xff0c;测试人员如何搭建测试环境&#xff0c;以供后面自己方便找&#xff0c;大家可以借鉴下搭建测试环境需要安装的有&#xff1a;nginx&#xff0c;redis&#xff0c;mysql&#xff0c;java&#xff0c;docker&#xff0c;保证这几个基本就可以用了&…

P1439 背包九讲(1):简单的0-1背包

P1439 背包九讲1&#xff1a;简单的0-1背包 一、原题呈现1、题目描述2、输入描述3、输出描述4、样例输入5、样例输出 二、思路分析这是一个最基础的01背包问题。 三、整体代码 一、原题呈现 1、题目描述 有一个箱子容量为 V&#xff08;正整数&#xff0c;0&#xff1c;&…

BUGKU-WEB source

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 看源码&#xff0c;看F12网络请求没有东西只能老老实实按照提示用Linux去扫描目录 相关工具 kali虚拟机安装gobuster 或者dirsearch 解题步骤 先查看源码&#xff1a; flag{Zmxhz19ub3RfaGvyzS…

Code Composer Studio (CCS) - Breakpoint (断点)

Code Composer Studio [CCS] - Breakpoint [断点] 1. BreakpointReferences 1. Breakpoint 选中断点右键 -> Breakpoint Properties… Skip Count&#xff1a;跳过断点总数&#xff0c;在断点执行之前设置总数 Current Count&#xff1a;当前跳过断电累计值 References […

Cron表达式选择器

Cron表达式选择器 功能描述 Cron表达式选择器是用于定时任务调度的一种常见工具&#xff0c;通常用于指定任务的执行时间。Cron表达式由一系列时间单位和对应的时间值组成&#xff0c;用于指定任务的执行时间。下面是一个Cron表达式的示例 0 0 12 * * ?这个表达式的含义是每…

适用于 Windows 的 12 个最佳 PDF 编辑器

PDF文档的普遍存在按理说&#xff0c;PDF文档的可读性和可移植性受到专业文档的青睐。 然而&#xff0c;PDF格式的可食用性是一大缺陷。幸运的是&#xff0c;各种 PDF 编辑工具和软件使 PDF 的编辑变得更加容易&#xff0c;这篇文章旨在帮助我们的读者找到其中最好的工具和软件…

IPv4编址方式

IPv4编址方式 本文的知识都可以到B站up湖科大教书匠的视频里去看具体讲解。 分类地址 IPv4地址被分为网络号和主机号&#xff0c;可分为A类地址、B类地址、C类地址、D类地址、E类地址。其中&#xff0c;只有A类、B类、C类地址的可用于给网络中的主机编址。 A类地址的网络号…

详解 leetcode_078. 合并K个升序链表.小顶堆实现

/*** 构造单链表节点*/ class ListNode{int value;//节点值ListNode next;//指向后继节点的引用public ListNode(){}public ListNode(int value){this.valuevalue;}public ListNode(int value,ListNode next){this.valuevalue;this.nextnext;} }package com.ag; import java.ut…

上位机图像处理和嵌入式模块部署(cmake的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 过去我们编写windows程序的时候&#xff0c;习惯上都是直接使用visual studio创建工程开发。而开发linux程序的时候&#xff0c;则是编写好c、cpp代…

计算机设计大赛 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)

这个教程可以实现点击我这个视频中所示的效果 一、元素自动排版功能 1、首先要往我们的unity项目中导入两个脚本文件&#xff0c;脚本文件名称分别是UIScrollEventListener和CZScrollRect&#xff0c;这两个脚本文件代码如下所示。 1-1、介绍UIScrollEventListener脚本写法。…

树和二叉树的基本知识

一、树的概念及结构 1.树的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个 特殊…

上位机图像处理和嵌入式模块部署(Halcon借鉴与客户学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多学院派的同学来说&#xff0c;他们对市场的感觉一般是比较弱的。如果写一个软件的话&#xff0c;或者说开发一个项目的话&#xff0c;他们…

SQL-Labs靶场“11-15”关通关教程

君衍. 一、十一关 基于POST单引号字符型注入1、源码分析2、联合查询注入3、报错注入 二、十二关 基于POST双引号字符型注入1、源码分析2、联合查询注入3、报错注入 三、十三关 基于POST单引号报错注入变形1、源码分析2、报错注入 四、十四关 基于POST双引号报错注入1、源码分析…

2024阿里云云服务器ECS价格表出炉

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

项目开发日志(登录页面):1. Header组件

Header组件 样式 说明 属性 属性名含义类型是否必填默认值linkUrl图标点击后链接界面String否javascript:;(none) 属性名含义类型是否必填默认值url图片路径String是无 样式 mainColor -> 主题颜色 代码 <template><div class"header-container&qu…

定制你的【Spring Boot Starter】,加速开发效率

摘要&#xff1a; 本文将介绍如何创建一个自定义的 Spring Boot Starter&#xff0c;让您可以封装常用功能和配置&#xff0c;并在多个 Spring Boot 项目中共享和重用。 1. 简介 Spring Boot Starter 是 Spring Boot 框架中的一种特殊的依赖项&#xff0c;它用于快速启动和配置…