LeetCode 189.轮转数组(三种方法解决)

文章目录

    • 题目
    • 暴力求解
    • 空间换时间
    • 三段逆置
    • 总结


题目

LeetCode 189.轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 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]

轮转数组是一种将数组中元素向右移动 k 个位置的操作。具体地,我们将数组的最后 k 个元素移动到数组的开头,而数组的前 n-k 个元素向后移动 k 个位置。

说简单点就是把后面的元素,依次转移到前面。


暴力求解

算法思路:

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

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

第一步:
在这里插入图片描述
第二步:

在这里插入图片描述
第三步:
在这里插入图片描述
代码实现:

void rotate(int* nums, int numsSize, int k)
{k %= numsSize;//防止k大于numsSizeint 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)


空间换时间

算法思路:

  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)


三段逆置

算法思路:

  1. 对前 n-k 个逆置
  2. 对后 k 个逆置
  3. 整体逆置

封装一个reverse逆置函数,进行操作。reverse 函数用于反转数组中指定范围的元素,这里使用了双指针来实现。

在这里插入图片描述
代码实现:

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);//第三段逆置
}

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


总结

最优算法:三段逆置>空间换时间>暴力求解

评判哪个方法为最优解,一般是关注该方法运行时的时间复杂度。时间复杂度低,算法计算时间越快,则为做优算法。
对于空间换时间的方法,虽然运行消耗内存增加,但一般不太会关注消耗内存的多少,现在随着技术发展的越来越快,对于内存的成本控制的也越开越低。所以用空间换时间,还是划算的。

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

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

相关文章

代码随想录算法训练营第四十九天丨 动态规划part12

309.最佳买卖股票时机含冷冻期 思路 相对于动态规划&#xff1a;122.买卖股票的最佳时机II (opens new window)&#xff0c;本题加上了一个冷冻期 在动态规划&#xff1a;122.买卖股票的最佳时机II (opens new window)中有两个状态&#xff0c;持有股票后的最多现金&#xf…

【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks 前言Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM Networks The Core Idea Behind LSTMsStep-by-Step LSTM Walk ThroughForget Gate LayerInput Gate LayerOutput Gate Layer Variants on Long Short Term MemoryConclus…

Rd-03D串口协议

帧头部帧内数据帧尾部AA FF 03 00目标 1 信息 目标 2 信息 目标 3 信息55 CC 其中单个目标具体包含的信息: 目标 x 坐标目标 y 坐标目标速度像素距离值signed int16 类型&#xff1b;最高位 1 对应正坐标&#xff0c;0 对应负坐标&#xff1b;其余 15 位代表 x 坐标绝对值&am…

Dart笔记:build_runner-用于 Dart 代码生成和模块化编译的构建系统

Dart笔记 build_runner 用于 Dart 代码生成和模块化编译的构建系统 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/artic…

npm 换源

你可以通过以下命令来将 npm 的源切换到阿里源&#xff1a; bashnpm config set registry https://registry.npm.taobao.org 这个命令会将 npm 的源设置为阿里的镜像源&#xff0c;这样你在安装 npm 包时&#xff0c;就会从阿里的镜像源下载&#xff0c;速度会更快。 如果你…

海康Visionmaster-Qt+VS 二次开发环境如何配置?

1 新建 Qt 工程&#xff0c;添加 Qt 模块 Core、GUI、Active Qt 和 Container Widgets 2 拷贝 DLL:VM\VisionMaster4.0.0\Development\V4.0.0\ComControl\bin\x64 下的所有拷贝到项目工程输出目录下&#xff0c;如下图所示&#xff0c;项目的输出路径是 Dll 文件夹。 3 第一…

JavaWeb Day10 案例 准备工作

目录 一、需求说明 二、环境搭建 &#xff08;一&#xff09;数据库 &#xff08;二&#xff09;后端 ①controller层 1.DeptController.java 2.EmpController.java ②mapper层 1.DeptMapper.java 2.EmpMapper.java ③pojo层 1.Dept.java 2.Emp.java 3.Result.ja…

STM32一

0.前言 在B站经常看见有人用stm32做出了有趣的电子小玩艺儿&#xff0c;感到很羡慕&#xff0c;于是想了解一下。 1.什么是stm32 STM32 是一系列由STMicroelectronics&#xff08;意法半导体&#xff09;公司设计和制造的32位ARM Cortex-M微控制器。这一系列的微控制器广泛用…

GetSimple CMS忘记密码

GetSimple CMS是一个超简单的 CMS&#xff0c;适合建立个人网站等只需要极少数页面的网站。在站上百科上&#xff0c;是这么说的&#xff1a; GetSimple是一款基于XML存储数据的开源内容管理系统&#xff0c;且易于安装和定制&#xff0c;无需MySQL支持。提供撤销保护和备份功能…

skynet学习笔记03— 服务

01、API newservice(name, ...)&#xff1a; 阻塞的形势启动一个名为 name 的新服务&#xff0c;待start函数执行完后会返回这个服务的地址。uniqueservice(name, ...)&#xff1a;针对于当前节点&#xff0c;启动一个唯一服务&#xff08;相当于单例&#xff09;&#xff0c;…

stm32 - Cortex

stm32 - Cortex 概念Cortex-M4 的工作模式和工作状态寄存器 概念 Cortex-M4 的工作模式和工作状态 处理模式 当处理器发生了异常或者中断&#xff0c;则进入处理模式进行处理&#xff0c;处理完成后返回到线程模式 权限大&#xff0c;访问处理器中所有的资源 线程模式 芯片复…

深度解剖Linux权限的概念

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;牢记Linux权限的概念。 > 毒鸡汤&#xff1a;你…

upload 文件自动上传写法,前后端 下载流文件流

<el-uploadv-model:file-list"fileList":action"app.api/student/student/import":headers"{// Content-Type: multipart/form-data;boundary----split-boundary, 此处切记不要加&#xff0c;否则会造成后端报错 Required request part file is…

HashMap的使用,以及内置方法

HashMap 是 Java 中常用的集合类之一&#xff0c;它实现了 Map 接口&#xff0c;基于哈希表实现。HashMap 允许存储键值对&#xff0c;其中键和值都可以是任意类型的对象。 1. 创建 HashMap import java.util.HashMap; import java.util.Map;public class HashMapExample {pu…

C语言--输入10个数字,要求输出其中值最大的元素和该数字是第几个数

今天小编带大家了解一下什么是“打擂台”算法。 一.思路分析 可以定义一个数组arr&#xff0c;长度为10&#xff0c;用来存放10个数字&#xff0c;设计一个函数Max&#xff0c;用来求两个数中的较大值&#xff0c; 定义一个临时变量tmparr[0],保存临时最大的值&#xff0c;下标…

Hive 常用存储、压缩格式

1. Hive常用的存储格式 TEXTFI textfile为默认存储格式 存储方式&#xff1a;行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive 无法进行合拆分 SEQUENCEFILE sequencefile二进制文件&#xff0c;以<key,value>的形式序列到文件中 存储方式&#xff1a;行存储 可…

洛谷 NOIP 2023 模拟赛 P9836 种树

洛谷 NOIP 2023 模拟赛 P9836 种树 文章目录 洛谷 NOIP 2023 模拟赛 P9836 种树题目大意思路code 题目大意 路边有 n n n 棵树&#xff0c;每棵树的 高度 均为正整数&#xff0c;记作 p 1 , p 2 … p n p_1, p_2 \dots p_n p1​,p2​…pn​。 定义一棵树的 宽度 为它高度的…

vagrant安装k8s集群

目录 概述前期准备安装virtualbox安装vagrant安装gitbash 集群架构集群安装集群初始化集群测试 概述 使用vagrant、virtualbox创建。 前期准备 安装virtualbox 访问官网安装&#xff0c;版本7.0.10 安装vagrant 访问官网安装&#xff0c;版本2.3.7 安装gitbash 访问官网…

Gogs安装和部署教程-centos上

0、什么是 Gogs? Gogs 是一款极易搭建的自助 Git 服务。 Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并且支持 Go 语言支持的 所有平台&#xff0c;包括 Linux、Mac OS X、Windo…

记录一次某某虚拟机的逆向

导语 学了一段时间的XPosed&#xff0c;发现XPosed真的好强&#xff0c;只要技术强&#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…