揭秘LeetCode面试神器:150题之189.轮转数组

时间:2025-02-08 00:03 分类:其他教程

在充满算法挑战的LeetCode面试中,有一类题目以其独特的魅力和实用性,让无数求职者折服。今天,我要为大家揭秘一道经典的面试题目——189.轮转数组。这道题目不仅考察了你对数组操作的熟练程度,还考验了你的逻辑思维和问题解决能力。

题目描述

给定一个整数数组 nums,你需要将数组中的元素向右轮转 k 个位置。这里的 k 是非负数,表示轮转的位数。例如,如果 nums = [1, 2, 3, 4, 5, 6, 7]k = 3,那么轮转后的数组应为 [5, 6, 7, 4, 3, 2, 1]

算法思路

为了高效地解决这个问题,我们可以采用“三次反转法”。这种方法的核心思想是通过三次局部反转来实现数组的右旋操作,而无需额外的空间。具体步骤如下:

  1. 处理 k 值:首先,我们需要对 k 取模数组的长度 n,以确保旋转次数在有效范围内。例如,如果 nums = [1, 2, 3, 4, 5, 6, 7]k = 10,那么经过处理后,k 将变为 10 % 7 = 3

  2. 全局反转:接下来,我们将整个数组元素顺序反转。此时,数组变为 [7, 6, 5, 4, 3, 2, 1]

  3. 前 k 个反转:然后,我们反转数组的前 k 个元素。在这个例子中,就是反转 [7, 6, 5],得到 [5, 6, 7]

  4. 剩余元素反转:最后,我们反转数组从 k 到末尾的元素。在这个例子中,就是反转 [5, 6],得到 [5, 6, 7, 4, 3, 2, 1]

操作解析示例

假设 nums = [1, 2, 3, 4, 5, 6, 7]k = 3,按照上述步骤操作后,数组将变为 [5, 6, 7, 4, 3, 2, 1]

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。因为我们需要遍历整个数组三次。
  • 空间复杂度:O(1),我们只使用了常数级别的额外空间。

代码实现

func rotate(nums []int, k int) {
    n := len(nums)
    if n == 0 {
        return
    }
    k %= n
    reverse(nums)
    reverse(nums[:k])
    reverse(nums[k:])
}

func reverse(a []int) {
    for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
        a[i], a[j] = a[j], a[i]
    }
}

关键点

  • 取模操作k %= n 确保旋转次数在有效范围内。
  • 原地反转:三次反转均直接操作原数组,无需额外空间。
  • 切片处理:Go 语言中切片传递为引用,因此可以直接修改原数组。

掌握这道题目,你将在LeetCode面试中脱颖而出,展现出你的算法才华和逻辑思维能力。祝你成功!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告