题目:
思路:
有两种做法
1、✅ 方法一:额外数组
在复制一份数组,然后在把结果放回去。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k % n; // 防止 k > n
int[] temp = new int[n];
for (int i = 0; i < n; i++) {
temp[(i + k) % n] = nums[i];
}
// 再把结果拷贝回原数组
for (int i = 0; i < n; i++) {
nums[i] = temp[i];
}
}
}
2、✅ 方法二:数组反转(最优解,空间 O(1))
Java版本
1)先翻转整体数组
2)在反转前K个
3)在反转后N - K 个
举例:
原数组 [1,2,3,4,5,6,7], k=3
整体反转 → [7,6,5,4,3,2,1]
反转前 3 个 → [5,6,7,4,3,2,1]
反转后 4 个 → [5,6,7,1,2,3,4] ✅
class Solution {
public void rotate(int[] nums, int k) {
// 翻转数组,先全部,在前k 在剩下的
int n = nums.length;
k = k % n;
reverse(nums, 0 , n - 1);
reverse(nums, 0 , k - 1);
reverse(nums, k , n - 1);
}
public void reverse(int[] nums, int left, int right) {
while(left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
}
python版本
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k = k % n
self.reverse(nums, 0, n - 1)
self.reverse(nums, 0, k - 1)
self.reverse(nums, k, n - 1)
def reverse(self, nums, left, right):
while left < right:
temp = nums[left]
nums[left] = nums[right]
nums[right] = temp
left += 1
right -= 1