欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > leetcode-189:轮转数组

leetcode-189:轮转数组

2024/10/25 21:40:25 来源:https://blog.csdn.net/D2510466299/article/details/142535978  浏览:    关键词: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. 应用上述算法,实现高效轮转,并更新配送系统。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com