Skip to content

Commit d940833

Browse files
committed
feat: add solutions to lc problem: No.0031
No.0031.Next Permutation
1 parent 0919dea commit d940833

File tree

6 files changed

+159
-37
lines changed

6 files changed

+159
-37
lines changed

solution/0000-0099/0031.Next Permutation/README.md

+60-7
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@
6262

6363
**方法一:两次遍历**
6464

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]$ 的元素是一个降序序列
6666

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]$ 的元素反转,即可得到下一个排列。
6868

6969
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
7070

@@ -129,7 +129,9 @@ public:
129129
void nextPermutation(vector<int>& nums) {
130130
int n = nums.size();
131131
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+
}
133135
if (~i) {
134136
for (int j = n - 1; j > i; --j) {
135137
if (nums[j] > nums[i]) {
@@ -149,10 +151,7 @@ public:
149151
func nextPermutation(nums []int) {
150152
n := len(nums)
151153
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-- {
156155
}
157156
if i >= 0 {
158157
for j := n - 1; j > i; j-- {
@@ -168,6 +167,60 @@ func nextPermutation(nums []int) {
168167
}
169168
```
170169

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+
171224
### **...**
172225

173226
```

solution/0000-0099/0031.Next Permutation/README_EN.md

+58-5
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ public:
119119
void nextPermutation(vector<int>& nums) {
120120
int n = nums.size();
121121
int i = n - 2;
122-
for (; ~i; --i) if (nums[i] < nums[i + 1]) break;
122+
while (~i && nums[i] >= nums[i + 1]) {
123+
--i;
124+
}
123125
if (~i) {
124126
for (int j = n - 1; j > i; --j) {
125127
if (nums[j] > nums[i]) {
@@ -139,10 +141,7 @@ public:
139141
func nextPermutation(nums []int) {
140142
n := len(nums)
141143
i := n - 2
142-
for ; i >= 0; i-- {
143-
if nums[i] < nums[i+1] {
144-
break
145-
}
144+
for ; i >= 0 && nums[i] >= nums[i+1]; i-- {
146145
}
147146
if i >= 0 {
148147
for j := n - 1; j > i; j-- {
@@ -158,6 +157,60 @@ func nextPermutation(nums []int) {
158157
}
159158
```
160159

160+
### **TypeScript**
161+
162+
```ts
163+
function nextPermutation(nums: number[]): void {
164+
const n = nums.length;
165+
let i = n - 2;
166+
while (i >= 0 && nums[i] >= nums[i + 1]) {
167+
--i;
168+
}
169+
if (i >= 0) {
170+
for (let j = n - 1; j > i; --j) {
171+
if (nums[j] > nums[i]) {
172+
[nums[i], nums[j]] = [nums[j], nums[i]];
173+
break;
174+
}
175+
}
176+
}
177+
for (let j = n - 1; j > i; --j, ++i) {
178+
[nums[i + 1], nums[j]] = [nums[j], nums[i + 1]];
179+
}
180+
}
181+
```
182+
183+
### **C#**
184+
185+
```cs
186+
public class Solution {
187+
public void NextPermutation(int[] nums) {
188+
int n = nums.Length;
189+
int i = n - 2;
190+
while (i >= 0 && nums[i] >= nums[i + 1]) {
191+
--i;
192+
}
193+
if (i >= 0) {
194+
for (int j = n - 1; j > i; --j) {
195+
if (nums[j] > nums[i]) {
196+
swap(nums, i, j);
197+
break;
198+
}
199+
}
200+
}
201+
for (int j = i + 1, k = n - 1; j < k; ++j, --k) {
202+
swap(nums, j, k);
203+
}
204+
}
205+
206+
private void swap(int[] nums, int i, int j) {
207+
int t = nums[j];
208+
nums[j] = nums[i];
209+
nums[i] = t;
210+
}
211+
}
212+
```
213+
161214
### **...**
162215

163216
```

solution/0000-0099/0031.Next Permutation/Solution.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ class Solution {
33
void nextPermutation(vector<int>& nums) {
44
int n = nums.size();
55
int i = n - 2;
6-
for (; ~i; --i)
7-
if (nums[i] < nums[i + 1]) break;
6+
while (~i && nums[i] >= nums[i + 1]) {
7+
--i;
8+
}
89
if (~i) {
910
for (int j = n - 1; j > i; --j) {
1011
if (nums[j] > nums[i]) {
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
public class Solution {
22
public void NextPermutation(int[] nums) {
3-
var index1 = -1;
4-
var index2 = 0;
5-
for (var i = 1; i < nums.Length; ++i)
6-
{
7-
if (nums[i - 1] < nums[i])
8-
{
9-
index1 = i - 1;
10-
index2 = i;
11-
}
12-
else if (index1 >= 0 && nums[index1] < nums[i])
13-
{
14-
index2 = i;
3+
int n = nums.Length;
4+
int i = n - 2;
5+
while (i >= 0 && nums[i] >= nums[i + 1]) {
6+
--i;
7+
}
8+
if (i >= 0) {
9+
for (int j = n - 1; j > i; --j) {
10+
if (nums[j] > nums[i]) {
11+
swap(nums, i, j);
12+
break;
13+
}
1514
}
1615
}
17-
18-
if (index1 >= 0)
19-
{
20-
var temp = nums[index1];
21-
nums[index1] = nums[index2];
22-
nums[index2] = temp;
16+
for (int j = i + 1, k = n - 1; j < k; ++j, --k) {
17+
swap(nums, j, k);
2318
}
24-
System.Array.Sort(nums, index1 + 1, nums.Length - index1 - 1);
19+
}
20+
21+
private void swap(int[] nums, int i, int j) {
22+
int t = nums[j];
23+
nums[j] = nums[i];
24+
nums[i] = t;
2525
}
2626
}

solution/0000-0099/0031.Next Permutation/Solution.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
func nextPermutation(nums []int) {
22
n := len(nums)
33
i := n - 2
4-
for ; i >= 0; i-- {
5-
if nums[i] < nums[i+1] {
6-
break
7-
}
4+
for ; i >= 0 && nums[i] >= nums[i+1]; i-- {
85
}
96
if i >= 0 {
107
for j := n - 1; j > i; j-- {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function nextPermutation(nums: number[]): void {
2+
const n = nums.length;
3+
let i = n - 2;
4+
while (i >= 0 && nums[i] >= nums[i + 1]) {
5+
--i;
6+
}
7+
if (i >= 0) {
8+
for (let j = n - 1; j > i; --j) {
9+
if (nums[j] > nums[i]) {
10+
[nums[i], nums[j]] = [nums[j], nums[i]];
11+
break;
12+
}
13+
}
14+
}
15+
for (let j = n - 1; j > i; --j, ++i) {
16+
[nums[i + 1], nums[j]] = [nums[j], nums[i + 1]];
17+
}
18+
}

0 commit comments

Comments
 (0)