本文旨在记录我的解题思路与思考过程(部分解法参考了其他优秀题解,参考来源已附文末),作为个人学习笔记以便后续复习回顾。文中如有疏漏或不足之处,欢迎指正交流。
一. 题述:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
二. 解题思路:
2.1 理解题意:
题意很好理解:
- 每次轮转,数组的最后一个元素移动到第一个位置,其余元素向后移动一位。(轮转
k
次 = 重复上述操作k
次) - 直接修改原数组(就地轮转),而不是返回新数组。
2.2 解题步骤:
我看到这道题首先想的就是暴力轮转(时间复杂度 O(nk)),但是太耗时了,最后并未通过。然后学习了官方题解的使用额外的数组(时间复杂度 O(n))以及数组翻转(时间复杂度 O(n))。具体如何实现请参考官方题解(链接放在文章末尾)。
三. 解题算法:
3.1 暴力轮转(不推荐)
3.1.1 基于Python3编写
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
## 暴力轮转(时间复杂度太高 O(nk))
for _ in range(k):
for i in range(len(nums) - 1, 0, -1):
a = nums[i - 1]
nums[i - 1] = nums[i]
nums[i] = a
3.1.2 基于Java编写
class Solution {
public void rotate(int[] nums, int k) {
for (int i = 0; i < k; i++) {
for (int j = nums.length - 1; j >= 1 ; j--) {
int a = nums[j - 1];
nums[j - 1] = nums[j];
nums[j] = a;
}
}
}
}
3.2 使用额外的数组(推荐)
3.2.1 基于Python3编写
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
### 使用额外的数组(O(n))
n = len(nums)
newArr = [0 for _ in range(n)]
for i in range(n):
newArr[(i + k) % n] = nums[i]
nums[:n] = newArr[:n]
3.2.2 基于Java编写
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
int[] newArr = new int[n];
for (int i = 0; i < n; i++) {
newArr[(i + k) % n] = nums[i];
}
// 将 newArr 数组复制到 nums
System.arraycopy(newArr, 0, nums, 0, n);
}
}
3.3 数组翻转(推荐)
3.3.1 基于Python3编写
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
### 反转数组
n = len(nums)
self.reverse(nums, 0, n - 1)
self.reverse(nums, 0, k % n - 1)
self.reverse(nums, k % n, n - 1)
# 就地反转
def reverse(self, arr: List[int], L: int, R: int):
while L < R:
a = arr[L]
arr[L] = arr[R]
arr[R] = a
L = L + 1
R = R - 1
3.3.2 基于Java编写
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
reverse(nums, 0, n - 1);
reverse(nums, 0, k % n - 1);
reverse(nums, k % n, n - 1);
}
public void reverse(int[] arr, int L, int R) {
while (L < R) {
int a = arr[L];
arr[L] = arr[R];
arr[R] = a;
L = L + 1;
R = R - 1;
}
}
}
版权声明
本文部分解题思路和代码实现参考自 LeetCode 官方题解《189. 轮转数组》(https://leetcode.cn/problems/rotate-array/solutions/551039/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/),所有引用内容仅供学习交流使用。