LeetCode 189.轮转数组

news2024/11/8 17:03:57

文章目录

  • 💡题目分析
  • 💡解题思路
    • 🚩思路1:暴力求解 --- 旋转k次
    • 🔔接口源码:
    • 🚩思路2:额外开数组
    • 🔔接口源码:
    • 🚩思路3:三段逆置
    • 📍算法设计
    • 🔔接口源码:

在这里插入图片描述

题目链接👉LeetCode 189.轮转数组👈

💡题目分析

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

💡解题思路

🚩思路1:暴力求解 — 旋转k次

假如我们要把数组 [1,2,3,4,5,6,7],向右旋转3

👇图解👇
在这里插入图片描述

第1步:定义一个临时变量 tmp,用来存放数组最后的元素7
第2步:把数组前 n-1 个值往后挪
第3步:把 tmp 的值放入前面空位置中去

👆这样就完成了 1 次轮转,如果要轮转 k 次,就需要循环 k 次就完成了

🔔接口源码:

void rotate(int* nums, int numsSize, int k)
{
    k %= numsSize;//防止k大于numsSize
    int tmp = 0;
    for (int i = 0; i < k; i++)
    {
        tmp = nums[numsSize - 1];
        for (int j = numsSize - 1; j > 0; j--)
        {
            nums[j] = nums[j - 1];
        }
        nums[0] = tmp;
    }
}

此方法:
时间复杂度:O(N^2) — 最坏情况
空间复杂度:O(1)

🚨但是这种解法是过不了的,LeetCode会限制效率,这种方法效率太低了

🚩思路2:额外开数组

空间换时间 的做法

👇图解👇
在这里插入图片描述

第1步:新开辟一个数组
第2步:把后 k 个元素放到新数组的前面
第3步:再把前 n-k 个元素放到新数组的后面(n是数组中元素总个数 也就是题目中的参数 numsSize

🔔接口源码:

void rotate(int* nums, int numsSize, int k)
{
	if (k > numsSize)
	{
		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)

🚩思路3:三段逆置

🥰非常绝绝子的方法!!!

👇图解👇
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第1步:对前 n-k 个逆置
第2步:对后 k 个逆置
第3步:整体逆置

此方法:
时间复杂度:O(N)
空间复杂度:O(1)

📍算法设计

先写一个逆置的函数来实现逆置的功能👇

void reverse(int* arr, int left, int right)
{
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

🚨我们使用 reverse逆置函数的时候要注意:数组下标是从 0 开始的
🚨我们还需要注意一个问题:如果 k 超过了数组元素个数怎么办?

比如:数组是 [ 1 2 3 4 5 6 7]k = 8 的时候,此时数组元素个数为 7,而要求向右旋转 8 个位置,如果按照上面分析的情况,第一趟对前 n - k 逆置,也就是 7-8个逆置,难道对前 -1 个逆置吗?

仔细想一下最后的结果会是什么?
结果数组就是 [ 7 1 2 3 4 5 6 ]
🚨我们要记住这道题的核心叫 轮转数组,也就是当轮转的次数超过数组长度的时候,又是新的一轮了!

所以,如果 k 大于数组长度,故首先对 k 取余,然后再次旋转,这不会影响最终结果!

🔔接口源码:

void reverse(int* arr, int left, int right)
{
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

void rotate(int* nums, int numsSize, int k) 
{
    if(k>numsSize)
    {
        k%=numsSize;
    }
   reverse(nums, 0, numsSize-k-1);
   reverse(nums, numsSize-k, numsSize-1);
   reverse(nums, 0, numsSize-1);
}

在这里插入图片描述

🥰希望大家能够理解!

总结🥰
以上就是本题讲解的全部内容啦🥳🥳🥳🥳
本文章所在【C语言刷题】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

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

相关文章

JavaWeb开发 —— Web入门

目录 一、Spring 二、SpringBootWeb快速入门 三、HTTP协议 1. 概述 2. 请求协议 3. 响应协议 四、Web服务器 - Tomcat 1. 介绍 2. 基本使用 3. 入门程序解析 一、Spring ① 官网&#xff1a;http://spring.io ② Spring 发展到今天已经形成了一种开发生态圈&…

2022 idea 从原型创建maven项目框架--以创建niif-processors为列

目录一、idea配置二、下载archetype-catalog.xml文件三、创建设置四、创建成功截图一、idea配置 在如下两张图片花圈的位置添加如下参数 -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue 二、下载…

Qt Quick - 导航控件综述

Qt Quick - 导航控件综述一、概述二、StackView控件三、SwipeView控件四、TabBar控件五、TabButton控件一、概述 Qt Quick Controls提供了一系列导航模型。 控件功能Drawer可以用滑动手势打开和关闭的侧滑动面板StackView提供基于堆栈的导航模型SwipeView允许用户通过横向滑动…

面试官:谈谈你对TypeScript有什么了解

TypeScript 相关面试题1.说说你对 TypeScript 的理解&#xff1f;与 JavaScript 的区别是什么特性区别2.说说你对 TypeScript 中类的理解&#xff1f;应用场景&#xff1f;是什么使用方式继承修饰符私有修饰符受保护修饰符只读修饰符静态属性抽象类应用场景3.说说 typescript 的…

简单易用的公司网页模板,助您快速建站

在当今数字化时代&#xff0c;拥有一个高质量的公司网页是每个企业成功的关键。然而&#xff0c;对于那些没有技术专业知识的人来说&#xff0c;创建一个专业的网页可能是一项艰巨的任务。但是&#xff0c;现在有许多简单易用的公司网页模板可用于帮助您快速建站。 下面&#…

【CSS】文字溢出问题 ( 强制文本在一行中显示 | 隐藏文本的超出部分 | 使用省略号代替文本超出部分 )

文章目录一、文字溢出问题二、文字溢出处理方案三、代码示例一、文字溢出问题 在元素对象内部显示文字 , 如果文本过长 , 则会出现文本溢出的问题 ; 下面的示例中 , 在 150x25 像素的盒子中 , 显示 骐骥一跃&#xff0c;不能十步;驽马十驾&#xff0c;功在不舍; 一段话 , 明显…

【初识C++】(缺省参数和函数重载)

文章目录一、缺省参数1.缺省参数定义2.缺省参数分类2.1全缺省参数2.2半缺省参数二、函数重载1.函数重载概念2.构成重载的几种方式为什么会有函数重载及其原理一、缺省参数 1.缺省参数定义 缺省参数是在函数的声明中给定参数一个指定的值。 如果传参没有给定参数&#xff0c;那…

三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐

多数人消遣的方式一般是听听音乐玩玩游戏&#xff0c;想要更好的体验感最少不了的一定就是蓝牙耳机了&#xff0c;可对于大多数人来说&#xff0c;irpods之类的属实太贵了&#xff0c;所以更多人追求性价比&#xff0c;之前也买过不靠谱的耳机&#xff0c;用几天就坏了&#xf…

MySQL数据库:索引

一、索引简介 1.概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 相当于是给数据库中的数据建立了一个目录&#xff0c;通过目录可以知道…

QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。

QT多线程5种用法第一种 主线程(GUI)第二种 子线程1继承自QThread头文件 movetothread4.h源文件 movetothread4.cpp子线程1对象的创建第二种 子线程2继承自QThread头文件源文件对象创建位置&#xff08;销毁&#xff09;第三种 子线程3继承自QThread头文件源文件对象的创建第四种…

基于matlab仿真机械手

一、前言该示例显示了处于主动立体视觉模式的操纵器。它说明了立体渲染属性的效果以及如何使用立体视觉 VRFIGURE 属性。仅当图形卡支持四缓冲 OpenGL 渲染并由图形卡驱动程序启用时&#xff0c;操纵器才会以活动立体视觉模式显示。请注意&#xff0c;只有当您使用带有主动快门…

Android 布局 Fragment

Android 布局 FragmentFragment出现的初衷生命周期onCreate()onPause()onAttach()onCreateView()onActivityCreated()onDestroyView()onDetach()您可能还想扩展几个子类&#xff0c;而非 Fragment 基类&#xff1a;DialogFragmentListFragmentPreferenceFragmentCompat同系列文…

2.3.2单链表的插入删除

按位序插入&#xff08;带头结点&#xff09; 将第i-1个结点的指针指向第i个结点。 头节点看作是第0个结点。 s->datae //设定s指针的数据域为e s->nextp->next //将p指针指向的位置赋值给s指针指向的位置 p->nexts //再将s的数据域赋值给p指针指向的位置…

浅析分布式理论的CAP

大家好&#xff0c;我是易安&#xff01; 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中&#xff0c;可用性和数据一致性是两个至关重要的因素&#xff0c;而CAP理论就是在这两者之间提供了一种权衡的原则&#xff0c;帮助我们在设计分布式系统时进…

MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

光伏发电功率主要受太阳辐照度影响&#xff0c;所以准确预测太阳辐照度对光伏功率预测十分重要。程序采用小波分解先对辐照度数据进行分解&#xff0c;然后再用bp神经网络对分解的辐照度数据分别预测&#xff0c;再组合作为最后的预测结果。 人工神经网络(Artificial Neural …

研0进阶式学习---数据库1

目录Excel和数据库数据库的分类数据库的举例数据库基本结构数据库管理系统xampp、Navicat、MySQL基础知识与界面展示数据库基本连接步骤Excel和数据库 Excel和数据库都是用来存储数据的工具&#xff0c;但它们有以下区别和联系&#xff1a; 区别&#xff1a; 数据类型&#…

Java实现内网穿透

使用场景 1、当公司的一些系统功能使用了第三方服务时&#xff0c;通常第三方会回调我们的接口。在对接阶段&#xff0c;为了方便debug&#xff0c;我们肯定希望能回调到我们本地电脑上来。 2、当你在公司想访问部署在家里电脑的服务或者文件时。 3、当你的外地同事想访问你…

搭建nginx反向代理实现动静态分离

搭建nginx反向代理实现动静态分离一、实现高可用动静分离二 实验步骤2.1 安装nginx和开启路由转发2.2 实现lvs负载均衡2.3 实现动态网页功能2.4 实现nginx反向代理2.5 重启服务网页查看一、实现高可用动静分离 1、部署目的 ①用户访问业务时访问虚拟ip由lvs负责转发请求到业务…

LAMP及论坛搭建

1.编译安装apache 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 systemctl stop firewalld.service setenforce 0[rootlocalhost opt]# lsapr-1.6.2.tar.gz apr-util-1.6.0.tar.gz httpd-2.4.29.tar.bz2安装环境依赖包 yum -y install gcc gcc-c make pc…

淘宝商品数据分析怎么操作?从哪些方面下手?

说起淘宝上面的商品可谓是成千上万&#xff0c;因此要是想对这些商品进行数据分析的话&#xff0c;也是需要一些技能的&#xff0c;并不是所有的数据都特别重要&#xff0c;我们需要学会选择比较重要的数据来进行分析。详细内容还请各位接着往下看! 一、根据淘宝指数分析以下相…