当前位置: 首页 > news >正文

【Leetcode hot 100】189.轮转数组

问题链接

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 <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

问题解答

要解决这个问题,我们可以使用三次反转的方法,该方法具有时间复杂度低(O(n))和空间复杂度优(O(1))的特点。以下是详细的思路和实现步骤:

方法思路

轮转数组的核心是将数组元素向右移动 k 个位置。直接移动元素会涉及大量的元素交换,效率较低。而三次反转的方法可以高效地实现这一目标,具体步骤如下:

  1. 处理 k 的取值:由于数组长度为 n 时,向右移动 n 个位置相当于没有移动,因此先对 k 取模(k = k % n),避免无效操作。
  2. 反转整个数组:将原数组整体反转,使得末尾的 k 个元素移动到数组前面。
  3. 反转前 k 个元素:将前 k 个元素反转,恢复它们的相对顺序。
  4. 反转剩余元素:将剩下的 n-k 个元素反转,恢复它们的相对顺序。

解决代码

class Solution {public void rotate(int[] nums, int k) {int n = nums.length;if (n == 0) return; // 处理空数组情况k %= n; // 取模,减少不必要的移动if (k == 0) return; // k为0时无需移动// 三次反转reverse(nums, 0, n - 1);    // 反转整个数组reverse(nums, 0, k - 1);    // 反转前k个元素reverse(nums, k, n - 1);    // 反转剩余的n-k个元素}// 辅助函数:反转数组从start到end的部分private void reverse(int[] nums, int start, int end) {while (start < end) {// 交换首尾元素int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}
}

代码解释

  1. 处理边界情况:首先判断数组是否为空(n == 0),或 k 取模后为0(k == 0),此时无需移动,直接返回。
  2. 取模操作:通过 k %= n 确保 k 在有效范围内(0 ≤ k < n),避免重复移动。
  3. 三次反转
    • 第一次反转:将整个数组反转,使末尾的 k 个元素移动到数组前端。
    • 第二次反转:反转前 k 个元素,恢复它们的相对顺序。
    • 第三次反转:反转剩余的 n-k 个元素,恢复它们的相对顺序。
  4. 辅助函数 reverse:通过双指针法交换数组首尾元素,实现局部反转,时间复杂度为 O(n)。

这种方法高效且空间复杂度低,适合处理大规模数组。

http://www.dtcms.com/a/335497.html

相关文章:

  • 【C2000】C2000例程使用介绍
  • 24. 什么是不可变对象,好处是什么
  • Flink作业执行的第一步:DataFlow graph的构建
  • 一周学会Matplotlib3 Python 数据可视化-多子图及布局实现
  • 【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
  • Python可视化工具-Bokeh:动态显示数据
  • 【Golang】:错误处理
  • 10 SQL进阶-SQL优化(8.15)
  • 【Luogu】每日一题——Day21. P3556 [POI 2013] MOR-Tales of seafaring (图论)
  • 中国大学MOOC--C语言程序设计第十周字符串(下)
  • openEuler等Linux系统中如何复制移动硬盘的数据
  • HTTPS 配置与动态 Web 内容部署指南
  • Hadoop入门
  • SpringCloud 06 服务容错 Sentinel
  • NY270NY273美光固态闪存NY277NY287
  • 黎阳之光:以动态感知与 AI 深度赋能,引领电力智慧化转型新革命
  • mysql||事务相关知识
  • nertctl使用了解
  • Node.js导入MongoDB具体操作
  • IoT/HCIP实验-5/基于WIFI的智慧农业实验(LwM2M/CoAP+PSK+ESP8266 连接到 IoTDA)
  • python study notes[4]
  • Vue深入组件:Props 详解3
  • 【adb端口5555】烽火hg680-gy_烽火hg680-gc安卓9线刷烧录包 解决用一段时间就提示升级的问题
  • 回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(一)
  • 如何在 Ubuntu 24.04、22.04 或 20.04 Linux 中更改计算机名称
  • 智能化管理:开启海洋牧场新时代
  • 字节 Golang 大模型应用开发框架 Eino简介
  • Vue深入组件:Props 详解2
  • es7.17.x es服务yellow状态的排查查看节点,分片状态数量
  • 42 C++ STL模板库11-容器4-forward_list