leetcode-189:轮转数组

给定一个整数数组 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.mfbz.cn/a/883257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

毕业设计选题:基于ssm+vue+uniapp的自助购药小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

828华为云征文|使用Flexus X实例集成ES搜索引擎

目录 一、应用场景 1.1 Flexus X实例概述 1.2 ES搜索引擎 二、安装相关服务 2.1 安装Elasticsearch7.17.0 2.2 安装kibana7.17.0 三、开通安全组规则 四、整体感受 4.1 Flexus X实例 4.2 使用感觉 一、应用场景 1.1 Flexus X实例概述 Flexus X实例是华为云推出的一款…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

如何在 macOS 上恢复未保存的 Excel 文件 – 文件恢复的最佳方法

Microsoft Excel 主要用于学生、员工和组织创建电子表格、报告和许多其他内容。我们是人&#xff0c;我们也容易忘记事情。因此&#xff0c;您想要在 macOS 上恢复未保存的 Excel 文件并不罕见。 虽然在 Excel 上恢复未保存的电子表格很容易&#xff0c;但在 macOS 上就有些棘…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…

String类常用的方法

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

卡码网KamaCoder 108. 冗余连接

题目来源&#xff1a;108. 冗余连接 C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;并查集。因为原来是树&#xff0c;所以加入边之前肯定不是一个根&#xff0c;如果是一个根&#xff0c;再加一条边&#xff0c;肯定成环。所以只要找到根一致的两个点组成的边即…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分&#xff1a; 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的&#xff1a; 一、数据上报方式 本文的方案是&#xff0c;优先navigator.sendBeacon&#xff0c;降级使用1x1像素gif图片…

网站建设中,JavaScript为什么现在可以做后台了?

JavaScript&#xff0c;作为一种最初为浏览器端脚本设计的语言&#xff0c;已经逐渐发展成为可以在服务器端运行的强大工具。以下是JavaScript可以做后台开发的原因分析&#xff1a; Node.js的崛起 事件驱动与非阻塞I/O&#xff1a;Node.js的事件驱动和非阻塞I/O模型使得JavaSc…

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧&#xff0c;啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.&#xff0c;貌似呢require_once()已经被用过一次了&#xff0c;直接读取还不行&#xff0c;看一下下面的知识点. require_once() require…

2.1 HuggingFists系统架构(一)

系统架构 HuggingFists的前端主体开发语言为HtmlJavascript&#xff0c;后端的主体开发语言为Java。在算子部分有一定份额的Python代码&#xff0c;用于整合Python在数据处理方面强大能力。 功能架构 HuggingFists的功能架构如上&#xff0c;由下向上各层为&#xff1a; 数据存…

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…

windows11环境安装lua及luarocks(踩坑篇)

一、lua安装及下载 官方地址&#xff1a; Lua Binaries Download 从这里就有坑了&#xff0c;下载后先解压win64_bin.zip&#xff0c;之后解压lib&#xff0c;用lib中的文件替换win64的&#xff0c;并把include文件夹复制过去&#xff0c;之后复制并重命名lua54&#xff0c;方…

初识Jenkins持续集成系统

随着软件开发复杂度的不断提高&#xff0c;团队成员之间如何更好地协同工作以确保软件开发的质量&#xff0c;已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集成的效率明显高于人工操作;并且持续集成可以更…

【JVM原理】运行时数据区(内存结构)

JVM &#xff08;Java Virtual Machine&#xff09;原理 文章目录 四、运行时数据区&#xff08;内存结构&#xff09;4-1 线程私有区域程序计数器&#xff08;program counter Register&#xff09;本地方法栈&#xff08;Native Method Stacks&#xff09;Java 虚拟机栈&…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT&#xff1a;AI界的新宠儿1. 背景介绍2. MemGPT是什么&#xff1f;3. 如何安装MemGPT&#xff1f;4. 简单的库函数使用方法5. 场景应用场景一&#xff1a;创建持久聊天机器人场景二&#xff1a;文档分析场景三&#xff1a;多会话聊天互动 6. 常见Bug及解决方…

HTML中的表单(超详细)

一、表单 1.语法 <!-- action&#xff1a;提交的地方 method&#xff1a;提交的方式&#xff08;get会显示&#xff0c;post不会&#xff09; --> <form action"#" method"get"><p>名字&#xff1a;<input name"name" ty…

关联式容器——map与set

map与set map与set的使用序列式容器与关联式容器概念序列式容器 (Sequence Containers)常见的序列式容器&#xff1a; 关联式容器 (Associative Containers)常见的关联式容器&#xff1a; set的定义与使用set类的介绍set的构造和迭代器set的增删查&#xff08;无改&#xff09;…