Leetcode189:轮转数组
方法三:数组翻转
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部的 kmodn 个元素就被移至数组头部,然后我们再翻转 [0,kmodn−1] 区间的元素和 [kmodn,n−1] 区间的元素即能得到最后的答案。
我们以 n=7,k=3 为例进行如下展示:
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
}
复杂度分析
时间复杂度:O(n),其中 n 为数组的长度。每个元素被翻转两次,一共 n 个元素,因此总时间复杂度为 O(2n)=O(n)。
空间复杂度:O(1)。
作者:力扣官方题解
链接:https://leetcode.cn/problems/rotate-array/solutions/551039/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/
来源:力扣(LeetCode)
引用了美服翻转做法下面的评论(第一条) 希望能帮到大家
原地址
nums = “—–>–>”; k =3
result = “–>—–>”;
reverse “—–>–>” we can get “<–<—–”
reverse “<–” we can get “–><—–”
reverse “<—–” we can get “–>—–>”
this visualization help me figure it out :)
Leetcode189:轮转数组
http://example.com/2025/06/23/Leetcode189:轮转数组/