189 轮转数组
一、题目
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

二、题解
三次反转
向右轮转 k 步,本质上是:[1,2,3,4,5,6,7]最后 k 个数移动到前面:[5,6,7] + [1,2,3,4]
可以用三次反转完成:
原数组:[1,2,3,4,5,6,7]
第一步:反转整个数组[7,6,5,4,3,2,1]
第二步:反转前 k 个元素[5,6,7,4,3,2,1]
第三步:反转剩下的元素[5,6,7,1,2,3,4]
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
// 防止 k 大于数组长度
k = k % n;
// 1. 反转整个数组
reverse(nums, 0, n - 1);
// 2. 反转前 k 个元素
reverse(nums, 0, k - 1);
// 3. 反转剩下的元素
reverse(nums, k, n - 1);
}
private void reverse(int[] nums, int left, int right) {
while (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
}
时间复杂度:
空间复杂度:
评论