53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
- 若 ` k=3 ` , ` nums=[1,2,3,4,5,6,7] ` 。
56
+ ** 方法一:三次翻转 **
57
57
58
- 先将 ` nums ` 整体翻转: ` [1,2,3,4,5,6,7] ` -> ` [7,6,5,4,3,2,1] `
58
+ 我们不妨记数组长度为 $n$,然后将 $k$ 对 $n$ 取模,得到实际需要旋转的步数 $k$。
59
59
60
- 再翻转 ` 0~k-1 ` 范围内的元素: ` [7,6,5,4,3,2,1] ` -> ` [5,6,7,4,3,2,1] `
60
+ 接下来,我们进行三次翻转,即可得到最终结果:
61
61
62
- 最后翻转 ` k~n-1 ` 范围内的元素,即可得到最终结果:` [5,6,7,4,3,2,1] ` -> ` [5,6,7,1,2,3,4] `
62
+ 1 . 将整个数组翻转
63
+ 2 . 将前 $k$ 个元素翻转
64
+ 3 . 将后 $n - k$ 个元素翻转
65
+
66
+ 举个例子,对于数组 $[ 1, 2, 3, 4, 5, 6, 7] $, $k = 3$, $n = 7$, $k \bmod n = 3$。
67
+
68
+ 1 . 第一次翻转,将整个数组翻转,得到 $[ 7, 6, 5, 4, 3, 2, 1] $。
69
+ 2 . 第二次翻转,将前 $k$ 个元素翻转,得到 $[ 5, 6, 7, 4, 3, 2, 1] $。
70
+ 3 . 第三次翻转,将后 $n - k$ 个元素翻转,得到 $[ 5, 6, 7, 1, 2, 3, 4] $,即为最终结果。
71
+
72
+ 时间复杂度 $O(n)$,其中 $n$ 为数组长度。空间复杂度 $O(1)$。
63
73
64
74
<!-- tabs:start -->
65
75
70
80
``` python
71
81
class Solution :
72
82
def rotate (self , nums : List[int ], k : int ) -> None :
73
- """
74
- Do not return anything, modify nums in-place instead.
75
- """
83
+ def reverse (i : int , j : int ):
84
+ while i < j:
85
+ nums[i], nums[j] = nums[j], nums[i]
86
+ i, j = i + 1 , j - 1
87
+
76
88
n = len (nums)
77
89
k %= n
78
- if n < 2 or k == 0 :
79
- return
80
- nums[:] = nums[::- 1 ]
81
- nums[:k] = nums[:k][::- 1 ]
82
- nums[k:] = nums[k:][::- 1 ]
90
+ reverse(0 , n - 1 )
91
+ reverse(0 , k - 1 )
92
+ reverse(k, n - 1 )
83
93
```
84
94
85
95
### ** Java**
@@ -88,52 +98,107 @@ class Solution:
88
98
89
99
``` java
90
100
class Solution {
101
+ private int [] nums;
102
+
91
103
public void rotate (int [] nums , int k ) {
92
- if (nums == null ) {
93
- return ;
94
- }
104
+ this . nums = nums;
95
105
int n = nums. length;
96
106
k %= n;
97
- if (n < 2 || k == 0 ) {
98
- return ;
99
- }
100
-
101
- rotate(nums, 0 , n - 1 );
102
- rotate(nums, 0 , k - 1 );
103
- rotate(nums, k, n - 1 );
107
+ reverse(0 , n - 1 );
108
+ reverse(0 , k - 1 );
109
+ reverse(k, n - 1 );
104
110
}
105
111
106
- private void rotate ( int [] nums , int i , int j ) {
107
- while ( i < j) {
112
+ private void reverse ( int i , int j ) {
113
+ for (; i < j; ++ i, -- j) {
108
114
int t = nums[i];
109
115
nums[i] = nums[j];
110
116
nums[j] = t;
111
- ++ i;
112
- -- j;
113
117
}
114
118
}
115
119
}
116
120
```
117
121
118
- ### ** JavaScript **
122
+ ### ** C++ **
119
123
120
- <!-- 这里可写当前语言的特殊实现逻辑 -->
124
+ ``` cpp
125
+ class Solution {
126
+ public:
127
+ void rotate(vector<int >& nums, int k) {
128
+ int n = nums.size();
129
+ k %= n;
130
+ reverse(nums.begin(), nums.end());
131
+ reverse(nums.begin(), nums.begin() + k);
132
+ reverse(nums.begin() + k, nums.end());
133
+ }
134
+ };
135
+ ```
121
136
122
- 使用原生 API 将数组的 ` k~n-1 ` 范围内的元素插入到前面
137
+ ### **Go**
123
138
124
- ``` js
139
+ ```go
140
+ func rotate(nums []int, k int) {
141
+ n := len(nums)
142
+ k %= n
143
+ reverse := func(i, j int) {
144
+ for ; i < j; i, j = i+1, j-1 {
145
+ nums[i], nums[j] = nums[j], nums[i]
146
+ }
147
+ }
148
+ reverse(0, n-1)
149
+ reverse(0, k-1)
150
+ reverse(k, n-1)
151
+ }
152
+ ```
153
+
154
+ ### ** TypeScript**
155
+
156
+ ``` ts
125
157
/**
126
- * @param {number[]} nums
127
- * @param {number} k
128
- * @return {void} Do not return anything, modify nums in-place instead.
158
+ Do not return anything, modify nums in-place instead.
129
159
*/
130
- var rotate = function (nums , k ) {
131
- k %= nums .length ;
132
- nums .splice (0 , 0 , ... nums .splice (- k, k));
133
- };
160
+ function rotate(nums : number [], k : number ): void {
161
+ const n: number = nums .length ;
162
+ k %= n ;
163
+ const reverse = (i : number , j : number ): void => {
164
+ for (; i < j ; ++ i , -- j ) {
165
+ const t: number = nums [i ];
166
+ nums [i ] = nums [j ];
167
+ nums [j ] = t ;
168
+ }
169
+ };
170
+ reverse (0 , n - 1 );
171
+ reverse (0 , k - 1 );
172
+ reverse (k , n - 1 );
173
+ }
134
174
```
135
175
136
- 使用三次数组翻转 + 双指针实现翻转
176
+ ### ** C#**
177
+
178
+ ``` cs
179
+ public class Solution {
180
+ private int [] nums ;
181
+
182
+ public void Rotate (int [] nums , int k ) {
183
+ this .nums = nums ;
184
+ int n = nums .Length ;
185
+ k %= n ;
186
+ reverse (0 , n - 1 );
187
+ reverse (0 , k - 1 );
188
+ reverse (k , n - 1 );
189
+ }
190
+
191
+ private void reverse (int i , int j ) {
192
+ for (; i < j ; ++ i , -- j ) {
193
+ int t = nums [i ];
194
+ nums [i ] = nums [j ];
195
+ nums [j ] = t ;
196
+ }
197
+ }
198
+ }
199
+ ```
200
+
201
+ ### ** JavaScript**
137
202
138
203
``` js
139
204
/**
@@ -142,43 +207,17 @@ var rotate = function (nums, k) {
142
207
* @return {void} Do not return anything, modify nums in-place instead.
143
208
*/
144
209
var rotate = function (nums , k ) {
145
- k %= nums .length ;
146
- // 使用三次数组翻转
147
- reverse (nums, 0 , nums .length - 1 );
148
- reverse (nums, 0 , k - 1 );
149
- reverse (nums, k, nums .length - 1 );
210
+ const n = nums .length ;
211
+ k %= n;
212
+ const reverse = (i , j ) => {
213
+ for (; i < j; ++ i, -- j) {
214
+ [nums[i], nums[j]] = [nums[j], nums[i]];
215
+ }
216
+ };
217
+ reverse (0 , n - 1 );
218
+ reverse (0 , k - 1 );
219
+ reverse (k, n - 1 );
150
220
};
151
- function reverse (nums , start , end ) {
152
- // 双指针实现翻转
153
- while (start < end) {
154
- const temp = nums[start];
155
- nums[start] = nums[end];
156
- nums[end] = temp;
157
- start += 1 ;
158
- end -= 1 ;
159
- }
160
- }
161
- ```
162
-
163
- ### ** Go**
164
-
165
- ``` go
166
- func rotate (nums []int , k int ) {
167
- n := len (nums)
168
- k %= n
169
-
170
- reverse (nums, 0 , n-1 )
171
- reverse (nums, 0 , k-1 )
172
- reverse (nums, k, n-1 )
173
- }
174
-
175
- func reverse (nums []int , i , j int ) {
176
- for i < j {
177
- nums[i], nums[j] = nums[j], nums[i]
178
- i++
179
- j--
180
- }
181
- }
182
221
```
183
222
184
223
### ** Rust**
@@ -188,10 +227,6 @@ impl Solution {
188
227
pub fn rotate (nums : & mut Vec <i32 >, k : i32 ) {
189
228
let n = nums . len ();
190
229
let k = k as usize % n ;
191
- if n == 1 || k == 0 {
192
- return ;
193
- }
194
-
195
230
nums . reverse ();
196
231
nums [.. k ]. reverse ();
197
232
nums [k .. ]. reverse ();
0 commit comments