📅  最后修改于: 2023-12-03 15:09:37.268000             🧑  作者: Mango
问题:给定一个包含n个元素的数组,将这个数组向左旋转k个单元格。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [4,5,6,7,1,2,3] 解释: 向左旋转 1 步: [2,3,4,5,6,7,1] 向左旋转 2 步: [3,4,5,6,7,1,2] 向左旋转 3 步: [4,5,6,7,1,2,3]
说明: 尽可能找到更多的解决方案,这里提供了两种常见的方法。
思路:每次旋转一个单元格,旋转k次即可。
Python 代码:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
for i in range(k):
last = nums[-1]
for j in range(len(nums)-1, 0, -1):
nums[j] = nums[j-1]
nums[0] = last
Java 代码:
class Solution {
public void rotate(int[] nums, int k) {
int length = nums.length;
k %= length;
int temp, previous;
for (int i = 0; i < k; i++) {
previous = nums[length - 1];
for (int j = 0; j < length; j++) {
temp = nums[j];
nums[j] = previous;
previous = temp;
}
}
}
}
思路:先将整个数组反转,再将前k个元素反转,最后将剩余的元素反转,得到结果。
Python 代码:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
n = len(nums)
k %= n
nums[:] = nums[::-1]
nums[:k] = nums[:k][::-1]
nums[k:] = nums[k:][::-1]
Java 代码:
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 start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
以上两种方法均为时间复杂度为O(n),空间复杂度为O(1)的旋转方法。