翻转前 k 个元素(第二次翻转):将 [7,6,5] 翻转后变为 [5,6,7],其余部门 [4,3,2,1] 保持稳定。
翻转剩余部门(第三次翻转):将 [4,3,2,1] 翻转后变为 [1,2,3,4]。
最终得到正确的 右移 k 次后的数组。 示例演示
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
复制代码
执行 rotate(nums, 3):
团体翻转: [7,6,5,4,3,2,1]
翻转前 3 个元素: [5,6,7,4,3,2,1]
翻转剩余部门: [5,6,7,1,2,3,4]
最终输出:[5,6,7,1,2,3,4] 时间复杂度分析
数组翻转的时间复杂度:
第一次翻转: O(n)
第二次翻转: O(k)
第三次翻转: O(n-k)
总时间复杂度为 O(n),相比于暴力解法(O(n × k))更高效。 空间复杂度分析
只使用了 常数级额外空间(int temp 变量),因此 空间复杂度为 O(1)。
问题与解答
[NOTE] 问题1
k %= n; // 取模运算,防止 k 超过数组长度(若 k == n,则轮转后数组稳定)这一句中,如果k超过数组长度会怎么样?如果k为n+1呢? 解答: 情况分析
如果 k 直接超过数组长度 n,那么我们实际上只关心 k % n 的结果,而不是 k 的实际值。 示例 1
假设数组 nums = [1,2,3,4,5],n = 5: