|
| 1 | +# 旋转数组 |
| 2 | + |
| 3 | +## 题目描述 |
| 4 | + |
| 5 | +给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 |
| 6 | + |
| 7 | +``` |
| 8 | +输入: [1,2,3,4,5,6,7] 和 k = 3 |
| 9 | +输出: [5,6,7,1,2,3,4] |
| 10 | +解释: |
| 11 | +向右旋转 1 步: [7,1,2,3,4,5,6] |
| 12 | +向右旋转 2 步: [6,7,1,2,3,4,5] |
| 13 | +向右旋转 3 步: [5,6,7,1,2,3,4] |
| 14 | +
|
| 15 | +输入: [-1,-100,3,99] 和 k = 2 |
| 16 | +输出: [3,99,-1,-100] |
| 17 | +解释: |
| 18 | +向右旋转 1 步: [99,-1,-100,3] |
| 19 | +向右旋转 2 步: [3,99,-1,-100] |
| 20 | +``` |
| 21 | + |
| 22 | +* 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 |
| 23 | +* 要求使用空间复杂度为 O(1) 的 原地 算法。 |
| 24 | + |
| 25 | +## 分析 |
| 26 | + |
| 27 | +将整个数组翻转后,在根据k的值将数组分割为两个数组分别翻转即可。 |
| 28 | + |
| 29 | +``` |
| 30 | +例如 [1,2,3,4,5,6,7] 和 k = 3 |
| 31 | +
|
| 32 | +第一次翻转 为 [7,6,5,4,3,2,1] |
| 33 | +k = 3, 将数组分割为 0-2 和 3-6 分别翻转 结果为 [5,6,7,1,2,3,4] |
| 34 | +``` |
| 35 | + |
| 36 | +## 算法 |
| 37 | + |
| 38 | +```java |
| 39 | +class Solution { |
| 40 | + public void rotate(int[] nums, int k) { |
| 41 | + int len = nums.length; |
| 42 | + k %= len; |
| 43 | + reverse(nums, 0, len - 1); |
| 44 | + reverse(nums, 0, k - 1); |
| 45 | + reverse(nums, k, len - 1); |
| 46 | + } |
| 47 | + |
| 48 | + private void reverse(int[] nums, int start, int end){ |
| 49 | + while(start < end){ |
| 50 | + int temp = nums[start]; |
| 51 | + nums[start++] = nums[end]; |
| 52 | + nums[end--] = temp; |
| 53 | + } |
| 54 | + } |
| 55 | +} |
| 56 | +``` |
0 commit comments