Skip to content

Commit 2fd42d5

Browse files
committed
Add solution 031
1 parent 62f6118 commit 2fd42d5

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ Complete solutions to Leetcode problems, updated daily.
4141
| 015 | [3Sum](https://github.com/yanglbme/leetcode/tree/master/solution/015.3Sum) | `Array`, `Two Pointers` |
4242
| 019 | [Remove Nth Node From End of List](https://github.com/yanglbme/leetcode/tree/master/solution/019.Remove%20Nth%20Node%20From%20End%20of%20List) | `Linked List`, `Two Pointers` |
4343
| 024 | [Swap Nodes in Pairs](https://github.com/yanglbme/leetcode/tree/master/solution/024.Swap%20Nodes%20in%20Pairs) | `Linked List` |
44+
| 031 | [Next Permutation](https://github.com/yanglbme/leetcode/tree/master/solution/031.Next%20Permutation) | `Array` |
4445
| 046 | [Permutations](https://github.com/yanglbme/leetcode/tree/master/solution/046.Permutations) | `Backtracking` |
4546
| 047 | [Permutations II](https://github.com/yanglbme/leetcode/tree/master/solution/047.Permutations%20II) | `Backtracking` |
4647
| 062 | [Unique Paths](https://github.com/yanglbme/leetcode/tree/master/solution/062.Unique%20Paths) | `Array`, `Dynamic Programming` |
4748
| 063 | [Unique Paths II](https://github.com/yanglbme/leetcode/tree/master/solution/063.Unique%20Paths%20II) | `Array`, `Dynamic Programming` |
4849
| 075 | [Sort Colors](https://github.com/yanglbme/leetcode/tree/master/solution/075.Sort%20Colors) | `Array`, `Two Pointers`, `Sort` |
49-
075.Sort Colors
5050
| 082 | [Remove Duplicates from Sorted List II](https://github.com/yanglbme/leetcode/tree/master/solution/082.Remove%20Duplicates%20from%20Sorted%20List%20II) | `Linked List` |
5151
| 153 | [Find Minimum in Rotated Sorted Array](https://github.com/yanglbme/leetcode/tree/master/solution/153.Find%20Minimum%20in%20Rotated%20Sorted%20Array) | `Array`, `Binary Search` |
5252

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
## 下一个排列
2+
### 题目描述
3+
4+
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
5+
6+
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
7+
8+
必须原地修改,只允许使用额外常数空间。
9+
10+
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
11+
12+
`1,2,3``1,3,2`
13+
14+
`3,2,1``1,2,3`
15+
16+
`1,1,5``1,5,1`
17+
18+
### 解法
19+
从后往前,找到第一个升序状态的位置,记为 i-1,在[i, length - 1] 中找到比 nums[i - 1] 大的,且差值最小的元素(如果有多个差值最小且相同的元素,取后者),进行交换。将后面的数组序列升序排列,保存。然后恢复 i,继续循环。
20+
21+
22+
```java
23+
class Solution {
24+
public void nextPermutation(int[] nums) {
25+
boolean flag = false;
26+
for (int i = nums.length - 2; i >= 0; --i) {
27+
if (nums[i] < nums[i + 1]) {
28+
int index = findMinIndex(nums, i, nums[i]);
29+
swap(nums, i, index);
30+
reverse(nums, i + 1);
31+
flag = true;
32+
break;
33+
}
34+
}
35+
if (!flag) {
36+
Arrays.sort(nums);
37+
}
38+
}
39+
40+
private void reverse(int[] nums, int start) {
41+
int end = nums.length - 1;
42+
while (start < end) {
43+
swap(nums, start++, end--);
44+
}
45+
}
46+
47+
/**
48+
* 找出从start开始的比val大的最小元素的下标,如果有多个,选择后者
49+
*
50+
* @param name
51+
* @param start
52+
* @param val
53+
* @return index
54+
*/
55+
private int findMinIndex(int[] nums, int start, int val) {
56+
int end = nums.length - 1;
57+
int i = start;
58+
for (; i < end; ++i) {
59+
if (nums[i + 1] <= val) {
60+
break;
61+
}
62+
}
63+
return i;
64+
}
65+
66+
private void swap(int[] nums, int i, int j) {
67+
int t = nums[i];
68+
nums[i] = nums[j];
69+
nums[j] = t;
70+
}
71+
}
72+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution {
2+
public void nextPermutation(int[] nums) {
3+
boolean flag = false;
4+
for (int i = nums.length - 2; i >= 0; --i) {
5+
if (nums[i] < nums[i + 1]) {
6+
int index = findMinIndex(nums, i, nums[i]);
7+
swap(nums, i, index);
8+
reverse(nums, i + 1);
9+
flag = true;
10+
break;
11+
}
12+
}
13+
if (!flag) {
14+
Arrays.sort(nums);
15+
}
16+
}
17+
18+
private void reverse(int[] nums, int start) {
19+
int end = nums.length - 1;
20+
while (start < end) {
21+
swap(nums, start++, end--);
22+
}
23+
}
24+
25+
/**
26+
* 找出从start开始的比val大的最小元素的下标,如果有多个,选择后者
27+
*
28+
* @param name
29+
* @param start
30+
* @param val
31+
* @return index
32+
*/
33+
private int findMinIndex(int[] nums, int start, int val) {
34+
int end = nums.length - 1;
35+
int i = start;
36+
for (; i < end; ++i) {
37+
if (nums[i + 1] <= val) {
38+
break;
39+
}
40+
}
41+
return i;
42+
}
43+
44+
private void swap(int[] nums, int i, int j) {
45+
int t = nums[i];
46+
nums[i] = nums[j];
47+
nums[j] = t;
48+
}
49+
}

0 commit comments

Comments
 (0)