LeetCode 189. 轮转数组
题目描述
思路分析
解法一:三次翻转(推荐)
核心思路:
- 先整体翻转数组,再分别翻转前 k 个元素与后 n-k 个元素。
- 这样等价于把后段移动到前面,且保持相对顺序。
- 需对 k 取模处理,避免越界。
复杂度分析:
- 时间复杂度:O(n),其中 n 为数组长度。
- 空间复杂度:O(1),原地翻转。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k %= n;
// 三次翻转完成轮转
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
private void reverse(int[] nums, int l, int r) {
while (l < r) {
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
l++;
r--;
}
}
}
func rotate(nums []int, k int) {
n := len(nums)
k %= n
// 三次翻转完成轮转
reverse(nums, 0, n-1)
reverse(nums, 0, k-1)
reverse(nums, k, n-1)
}
func reverse(nums []int, l, r int) {
for l < r {
nums[l], nums[r] = nums[r], nums[l]
l++
r--
}
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 151. 反转字符串中的单词 | 中等 | 翻转技巧 |
| 541. 反转字符串 II | 简单 | 双指针 |
| 61. 旋转链表 | 中等 | 链表操作 |
| 396. 旋转函数 | 中等 | 数学推导 |
| 48. 旋转图像 | 中等 | 原地变换 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
