面试经典-轮转数组
轮转数组 的题解
题目详情
给定一个整数数组
nums,将数组中的元素向右轮转k个位置,其中k是非负数。示例 1:
1
2
3
4
5
6 输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]示例 2:
1
2
3
4
5 输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]提示:
1 <= nums.length <= 105-231 <= nums[i] <= 231 - 10 <= k <= 105进阶:
- 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)的 原地 算法解决这个问题吗?
首先暴力求解法
1 | public static void rotateA(int[] nums, int k) { |
此解法的时间复杂度为O(n^2),当nums的length和k值过大时,会超时

数组copy法
1 | public void rotate(int[] nums, int k) { |
用空间换时间,其中需要注意的一点时 (i + k) % n
假定 nums = [1,2,3,4,5] k =2
第一次执行for循环的时候,我们会将 (i+k)%n => (0+2)%5
所以,我们会将1=> 放到 newArr[0] 的位置,so,数组为 [0,0,1,0,0]
经过
nums.length次转换,就会变成 => [4,5,1,2,3]

数组翻转
1 | public void rotate(int[] nums, int k) { |
解析 假定 nums = [1,2,3,4,5] k =2
首先,我们将数组进行反转 nums => [5,4,3,2,1]
其次,我们将0,k-1位置的数据进行反转 => [4,5,3,2,1]
最后,我们将k,nums.length上的数据进行反转 => [4,5,1,2,3]
环状替换 推荐好好理解理解
1 | public void rotate(int[] nums, int k) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 可乐大红袍🥤🥤🥤!