62
62
63
63
** 方法一:两次遍历**
64
64
65
- 我们先从后往前遍历数组,找到第一个下降的位置 $i$,即 $nums[ i] \lt nums[ i + 1] $。
65
+ 我们先从后往前遍历数组 $nums$,找到第一个满足 $nums[ i] \lt nums[ i + 1] $ 的位置 $i$,那么 $nums [ i ] $ 就是我们需要交换的元素,而 $nums [ i + 1 ] $ 到 $nums [ n - 1 ] $ 的元素是一个降序序列 。
66
66
67
- 然后从后往前遍历数组,找到第一个大于 $nums[ i ] $ 的位置 $j$,即 $nums[ j] \gt nums[ i] $。交换 $ nums[ i] $ 和 $nums[ j] $,然后将 $nums[ i + 1] $ 到 $nums[ n - 1] $ 的元素反转,即可得到下一个排列。
67
+ 接下来,我们再从后往前遍历数组 $nums$,找到第一个满足 $nums[ j] \gt nums[ i] $ 的位置 $j$,然后我们交换 $ nums[ i] $ 和 $nums[ j] $。最后,我们将 $nums[ i + 1] $ 到 $nums[ n - 1] $ 的元素反转,即可得到下一个排列。
68
68
69
69
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
70
70
@@ -129,7 +129,9 @@ public:
129
129
void nextPermutation(vector<int >& nums) {
130
130
int n = nums.size();
131
131
int i = n - 2;
132
- for (; ~ i; --i) if (nums[ i] < nums[ i + 1] ) break;
132
+ while (~ i && nums[ i] >= nums[ i + 1] ) {
133
+ --i;
134
+ }
133
135
if (~ i) {
134
136
for (int j = n - 1; j > i; --j) {
135
137
if (nums[ j] > nums[ i] ) {
@@ -149,10 +151,7 @@ public:
149
151
func nextPermutation(nums []int) {
150
152
n := len(nums)
151
153
i := n - 2
152
- for ; i >= 0; i-- {
153
- if nums[i] < nums[i+1] {
154
- break
155
- }
154
+ for ; i >= 0 && nums[i] >= nums[i+1]; i-- {
156
155
}
157
156
if i >= 0 {
158
157
for j := n - 1; j > i; j-- {
@@ -168,6 +167,60 @@ func nextPermutation(nums []int) {
168
167
}
169
168
```
170
169
170
+ ### ** TypeScript**
171
+
172
+ ``` ts
173
+ function nextPermutation(nums : number []): void {
174
+ const n = nums .length ;
175
+ let i = n - 2 ;
176
+ while (i >= 0 && nums [i ] >= nums [i + 1 ]) {
177
+ -- i ;
178
+ }
179
+ if (i >= 0 ) {
180
+ for (let j = n - 1 ; j > i ; -- j ) {
181
+ if (nums [j ] > nums [i ]) {
182
+ [nums [i ], nums [j ]] = [nums [j ], nums [i ]];
183
+ break ;
184
+ }
185
+ }
186
+ }
187
+ for (let j = n - 1 ; j > i ; -- j , ++ i ) {
188
+ [nums [i + 1 ], nums [j ]] = [nums [j ], nums [i + 1 ]];
189
+ }
190
+ }
191
+ ```
192
+
193
+ ### ** C#**
194
+
195
+ ``` cs
196
+ public class Solution {
197
+ public void NextPermutation (int [] nums ) {
198
+ int n = nums .Length ;
199
+ int i = n - 2 ;
200
+ while (i >= 0 && nums [i ] >= nums [i + 1 ]) {
201
+ -- i ;
202
+ }
203
+ if (i >= 0 ) {
204
+ for (int j = n - 1 ; j > i ; -- j ) {
205
+ if (nums [j ] > nums [i ]) {
206
+ swap (nums , i , j );
207
+ break ;
208
+ }
209
+ }
210
+ }
211
+ for (int j = i + 1 , k = n - 1 ; j < k ; ++ j , -- k ) {
212
+ swap (nums , j , k );
213
+ }
214
+ }
215
+
216
+ private void swap (int [] nums , int i , int j ) {
217
+ int t = nums [j ];
218
+ nums [j ] = nums [i ];
219
+ nums [i ] = t ;
220
+ }
221
+ }
222
+ ```
223
+
171
224
### ** ...**
172
225
173
226
```
0 commit comments