leetcode-189:轮转数组

news2024/11/14 23:28:17

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

示例 1:

输入: 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]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

进阶:

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

步骤 1: 定义问题性质

给定一个整数数组 nums,需要将数组元素向右轮转 k 个位置。

输入条件:

  • nums 的长度在 [1, 10^5] 之间。
  • 数组元素的值在 [-2^31, 2^31 - 1] 之间。
  • 非负整数 k 的值在 [0, 10^5] 之间。

输出条件:

  • 返回一个数组,表示经过 k 次右轮转后的结果。

边界条件:

  • k 大于 nums 长度时,实际的轮转次数应为 k % nums.length
  • 如果 k 为 0,或者数组长度为 1,结果应为原数组。

步骤 2: 分解问题

  1. 处理 k 的值:计算有效的 k,即 k = k % nums.length
  2. 反转数组:将整个数组反转,这样最后 k 个元素会被放到开头。
  3. 反转子数组:分别反转前 k 个元素和后 n-k 个元素,以恢复顺序。

算法设计思路:

  • 反转算法是解决此类问题的有效方法,可以达到 O(n) 的时间复杂度和 O(1) 的空间复杂度。
  • 复杂度分析:
    • 时间复杂度:O(n),遍历数组三次。
    • 空间复杂度:O(1),使用常数额外空间。

数学证明

我们需要证明在给定整数数组 nums 和非负整数 k 的情况下,通过反转算法实现数组向右轮转 k 个位置的正确性。证明包括三个主要步骤。

定义和基础概念
  • 设数组长度为 n,初始数组为 nums
  • 向右轮转 k 个位置相当于将数组的最后 k 个元素移动到数组的开头,并将剩余的元素向后移动。
步骤 1: 计算有效的 k

在进行轮转之前,我们计算有效的 k: k′=kmod  nk' = k \mod nk′=kmodn 如果 k' 等于 0,则数组保持不变;否则,我们继续进行反转操作。

步骤 2: 反转整个数组

反转整个数组 nums: reverse(nums,0,n−1)\text{reverse}(nums, 0, n - 1)reverse(nums,0,n−1) 反转后的数组将变成: [last k′ elements,first (n−k′) elements][\text{last } k' \text{ elements}, \text{first } (n-k') \text{ elements}][last k′ elements,first (n−k′) elements]

例如,假设数组为 [1, 2, 3, 4, 5, 6, 7]k' = 3,反转后得到: [7,6,5,4,3,2,1][7, 6, 5, 4, 3, 2, 1][7,6,5,4,3,2,1]

步骤 3: 反转前 k' 个元素和后 n-k' 个元素
  1. 反转前 k' 个元素: reverse(nums,0,k′−1)\text{reverse}(nums, 0, k' - 1)reverse(nums,0,k′−1) 此时数组变为: [5,6,7,4,3,2,1][5, 6, 7, 4, 3, 2, 1][5,6,7,4,3,2,1]

  2. 反转后 n-k' 个元素: reverse(nums,k′,n−1)\text{reverse}(nums, k', n - 1)reverse(nums,k′,n−1) 最终得到: [5,6,7,1,2,3,4][5, 6, 7, 1, 2, 3, 4][5,6,7,1,2,3,4]

正确性证明

通过上述步骤,我们可以看到:

  • 初始反转将所有元素的位置完全改变,确保后续的反转能够有效地将目标元素排列到正确位置。
  • 对前 k' 个元素的反转确保了它们的顺序是正确的,因为这部分的元素在轮转后应该在数组的开始。
  • 对后 n-k' 个元素的反转同理,保证了这一部分的元素的顺序是正确的。

因此,经过这三个反转操作,最终数组呈现出经过 k 次右轮转的结果。

步骤 3: C++ 代码实现

步骤 4: 启发与优化

通过解决这个问题,可以认识到:

  • 反转算法是一种高效的数组处理技术,适用于各种旋转或重新排列问题。
  • 有效地利用模运算减少不必要的操作,可以提高程序性能。
  • 在处理大规模数据集时,算法的时间和空间复杂度的选择尤为重要,合理设计能显著提升效率。

步骤 5: 实际应用示例

应用场景:物流优化
在物流配送中,运输车辆常常需要根据不同的货物需求顺序重新安排送货顺序。通过应用此算法,可以高效地对送货路线进行调整。例如,当接到突发的送货请求时,系统可以迅速将当前配送路线向右轮转,以优先满足新的订单需求。这一过程可以通过实时数据更新来实现,确保配送效率。

具体实现方法:

  1. 将当前送货顺序表示为一个数组。
  2. 根据优先级调整需要发送的货物,计算新的送货顺序。
  3. 应用上述算法,实现高效轮转,并更新配送系统。

这样,物流公司可以快速响应市场变化,优化配送效率。

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

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

相关文章

快讯:腾讯轻量服务器四周年,最低一折续费,还有免费升配

最近腾讯云轻量服务器四周年庆开始了&#xff0c;免费升级配置&#xff0c;续费服务器最低一折。 最低一折续费&#xff1a; 持有多久的轻量服务器决定续费几折&#xff0c;已经持有四年就是一折&#xff0c;三年1.5折以此类推。 免费升级配置&#xff1a; 2-4-5免费升级到…

String类常用的方法

源代码&#xff1a; 输出结果&#xff1a;

Linux 之 logrotate 【日志分割】

简介 logrotate 是一个用于管理日志文件的工具。它可以自动对日志文件进行轮转、压缩、删除等操作&#xff0c;以防止日志文件无限增长占用过多磁盘空间。logrotate 通常作为一个守护进程定期运行&#xff0c;也可以通过 cron 任务来调度执行 工作原理 按照配置文件中的规则…

【Mysql多数据源实现读写分离的几种方案】

文章目录 一.什么是MySQL 读写分离二.读写分离的几种实现方式(手动控制)1.基于Spring下的AbstractRoutingDataSource1.yml2.Controller3.Service实现4.Mapper层5.定义多数据源6.继承Spring的抽象路由数据源抽象类&#xff0c;重写相关逻辑7. 自定义注解WR&#xff0c;用于指定当…

客户端数JSON据库SQL操作功能实现代码-———未来之窗行业应用跨平台架构

一、前端json结构化查询优点 以下是前端本地化查询的一些优点&#xff1a; 1. 快速响应&#xff1a;无需通过网络请求从服务器获取数据&#xff0c;查询结果能够立即返回&#xff0c;提供了几乎零延迟的用户体验&#xff0c;使应用更加流畅和响应迅速。 2. 离线可用性&#x…

9.4 Linux_I/O_访问目录、文件属性

访问目录 1、打开关闭目录 打开目录函数声明如下&#xff1a; //1.直接打开指定路径的目录文件 DIR *opendir(const char *name); //2.先用open打开目录文件&#xff0c;再用该函数访问目录文件 DIR *fdopendir(int fd); 返回值&#xff1a;成功返回指向打开的目录文件的结…

ELK-05-skywalking监控SpringCloud服务日志

文章目录 前言一、引入依赖二、增加日志配置文件三、打印日志四、skywalking网页查询链路五、日志收集5.1 修改logback-spring.xml5.2 重启SpringCloud服务并请求test接口5.3 查看skywalking网页的Log 总结 前言 基于上一章节&#xff0c;现在使用skywalkin监控SpringCloud服务…

JWT令牌技术介绍及使用

一、JWT介绍 JWT是JSON Web Token的缩写&#xff0c;即JSON Web令牌&#xff0c;是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务…

D. Determine Winning Islands in Race (cf div2,dp、图论最短路)

D. Determine Winning Islands in Race 思路: bfs找到E到达每个点的最短时间t[i]。 如果E要超过B&#xff0c;那么一定要借助辅助桥&#xff0c;从而获胜。 假设有u->v的辅助桥&#xff0c;E能通过这个桥超过B的条件是: s>u 且 t[v] < v-s 即 s的取值要为[u1,v-t[v]-…

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

目录 1.数组类 2.运算符重载 2.1加号运算符 2.1.1成员函数实现 2.1.2全局函数实现 2.1.3加号重载 2.2左移运算符 2.3递增运算符 2.4指针运算符 2.5赋值运算符 1.数组类 //默认构造函数 MyArray::MyArray() {m_Size 0;m_Capacity 100;pAddress new int[m_Capacity]…

【有啥问啥】深度解析迁移学习(Transfer Learning)

深度解析迁移学习&#xff08;Transfer Learning&#xff09; 在机器学习领域&#xff0c;迁移学习&#xff08;Transfer Learning&#xff09;作为一种强大的技术&#xff0c;正广泛应用于各种实际场景中。本文将详细解析迁移学习的基本概念、原理、分类、应用场景以及具体实…

vue3中storeToRefs让store中的结构出来的数据也能变成响应式

1、首先需要安装pinia 具体安装和使用教程参考 2、创建 src/stores/counter.js 文件&#xff0c;其内容如下&#xff1a; import {defineStore} from "pinia"; import {ref} from "vue";export const useCounterStore defineStore(counter,()>{const…

C语言程序设计题目十九:编写一万年历系统

文章目录 题目十九&#xff1a;编写一万年历系统calendar.hcalendar.ctest.c 题目十九&#xff1a;编写一万年历系统 要求&#xff1a; 模仿现实中的挂历&#xff0c;显示当前月的每一天及星期几&#xff0c;当系统日期变为下一个月时&#xff0c;自动翻页到下一个月。 calend…

【第3期】INFINI Easysearch 免费认证培训开放报名

探索 Easysearch 的无限可能&#xff0c;与 INFINI Labs 共赴搜索技术前沿&#xff01; 随着数字化转型的加速&#xff0c;搜索技术已成为企业数据洞察的核心。INFINI Labs 作为搜索创新技术的引领者&#xff0c;诚邀所有对 Easysearch 搜索引擎感兴趣的开发者、技术爱好者及合…

安卓13禁止待机 永不休眠 android13永不休眠

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 设置 =》显示 =》屏幕超时 =》 永不。 我们通过修改系统待机时间配置,来达到设置屏幕超时的配置。像网上好多文章都只写了在哪里改,改什么东西,但是实际上并未写明为什么要改那…

[智能控制】【第2 章 模糊控制的理论基础】

目录 第2章 模糊控制的理论基础 2.1 概述——模糊控制的提出 2.1 概述——模糊控制的特点 2.2 模糊集合 2.2.1 模糊集合 1 特征函数和隶属函数 2 模糊集合的表示 例2.1 例2.2 2.2.2 模糊集合的运算 1 模糊集合的基本运算 &#xff08;1&#xff09;空集…

docker搭建clickhouse并初始化用户名密码

1、新建挂载目录 mkdir -p /home/clickhouse-server/ mkdir -p /home/clickhouse-server/etc/2、拉取镜像 docker pull clickhouse/clickhouse-server3、创建临时容器 docker run -d --rm --name clickhouse-server --ulimit nofile262144:262144 clickhouse/clickhouse-ser…

目标检测流程

流程概述 背景&#xff1a;梳理目标检测标注&#xff0c;训练&#xff0c;部署全流程。供后续初学者快速上手 方案&#xff1a;Ubuntu&#xff08;PC端&#xff09;进行标注&#xff0c;基于OpenMMLab进行训练得到pt模型&#xff0c;pt模型通过转换rknn并部署。 1. 数据集 公…

成都睿明智科技有限公司可靠吗?

在这个短视频风靡的时代&#xff0c;抖音已不仅仅是一个娱乐平台&#xff0c;它更是无数商家眼中的蓝海市场&#xff0c;是电商领域的新宠儿。在这场流量与转化的盛宴中&#xff0c;成都睿明智科技有限公司以其敏锐的市场洞察力和专业的服务能力&#xff0c;正逐步成为抖音电商…

使用three.js 实现着色器草地的效果

使用three.js 实现着色器草地的效果 在线预览https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idgrassShader 在 https://threehub.cn 中还有很多案例 import * as THREE from three import { OrbitControls…