leetcode-189. 旋转数组 原地递归算法(非官方的三种方法)

news/2024/9/25 13:21:00/

Problem: 189. 轮转数组

思路

首先,很明显,题目要求的操作等同于将数组的后k%n个元素移动到前面来
然后我们思考原地操作的方法:
(为了方便讲解,我们先假设k<=n/2)

1.我们将数组划分为 [A,B]两段,其中B为后k个元素

2.那么我们想要实现的就是将B放到图中A1(数组的前k个元素)的位置

3.想要做到原地操作,那么容易想到:直接交换A1和B。这样B到了正确的位置,A1原始位置的数组也被保存了下来(放到了B原来的位置)

4.完成上一步操作后,我们得到的数组的形式是 [B,A2,A1],而题目预期的结果应该是 [B,A1,A2],可以发现 现在只要将由 [A2,A1] 构成的新数组进行题目中描述的旋转操作就可以转化为 [A1,A2] 了(形成递归)。

5.递归形成后,在新数组上调用我们的rotate函数就可以将新数组部分也完成旋转了。
(k>n/2的情况参考上面的方式也能推理出来,留给屏幕前的你来完成👍)

img

复杂度

时间复杂度:

假设共递归 t t t次,每一次递归都会使得 m i ( i ϵ [ 1 , t ] ) m_i(i \epsilon [1,t]) mi(iϵ[1,t])个元素去到目标位置,这个操作的代价是 m i m_i mi次交换操作,即每层递归为 O ( m ) O(m) O(m)。所有的 m i m_i mi加起来就等于总的元素个数 n n n,即总的时间复杂度为 O ( n ) O(n) O(n)

空间复杂度:

由于是在原地进行操作,故空间复杂度为 O ( 1 ) O(1) O(1)。但是其实递归的堆栈会消耗一定的空间。

Code

C++

class Solution {
public:void rotate(vector<int>& nums,int l,int r,int k){int n=r-l;k%=n;if(l+1>=r||!k)return;int i=l,j=0;if(k<=n/2)j=n-k+l;else j=k+l;while(j<r)swap(nums[i++],nums[j++]);if(k<=n/2)rotate(nums,l+k,r,k);else rotate(nums,l,r-n+k,2*k-n);return;}void rotate(vector<int>& nums, int k) {rotate(nums,0,nums.size(),k);return ;}
};

http://www.ppmy.cn/news/1463134.html

相关文章

C语言--函数递归与迭代

递归在书写的时候&#xff0c;有两个必要条件&#xff1a; 1.递归存在限制条件&#xff0c;但凡满足这个限制条件时&#xff0c;递归便不再继续 2.每次递归调用之后越来越接近这个限制条件 递归的思想&#xff1a; 把大事化小事 递归其实就是函数自己调用自己 //int main…

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称 代码如下&#xff1a; $rr $empire->fetch1("SELECT GROUP_CONCAT(id) from phome_enewsztinfo where ztid$r[id]"); $ff $rr[0]; $ga explode(",", $ff); …

C++小游戏 合集

生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…

MySQL---通用语法及分类

目录 一、SQL通用语法 二、 SQL分类 1.DDL 1.1 DDL数据库操作 1.2 DDL表操作---查询 1.3 DDL表操作---创建​编辑 1.4 DDL表操作---数据类型 1.5 DDL表操作---修改 1.6 DDL表操作---删除 1.7 DDL总结 2. 图形化界面工具DataGrip 2.1 创建 2.2 使用 3. DML 3.1 DML介绍 3.2 DM…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好&#xff0c;我是jiaoxingk 本篇文章主要讲解如何安装虚拟机&#xff0c;并且在虚拟机中安装centos系统&#xff0c;让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前&#xff0c;我们先做虚拟机的介绍 虚拟机&#xff1a;通过软件虚拟出来的…

分享一个用AI降本的思路,不懂代码也能上手

如何用AI解决实际的业务问题&#xff1f; 生财圈友我来利用ChatGPT做算法建模&#xff0c;每年为公司省下6万元。 今天他将分享通过ChatGPT进行数据分析的思路&#xff0c;从最开始定义问题到最终数据论证。 上手的实操过程门槛并不高&#xff0c;但可以实现把官方电商平台的…

【路径规划】基于飞蛾搜索算法实现复杂城市地形下无人机避障三维航迹规划

研究背景 复杂城市地形下无人机避障三维航迹规划是无人机技术领域的一个重要研究方向。无人机在城市环境中的广泛应用,如快递配送、城市监测和搜救等任务,对其航迹规划和避障能力提出了挑战。 研究背景包括以下方面: 无人机的快速发展:无人机技术在近年来得到了迅猛发展…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…