File tree 3 files changed +122
-1
lines changed
solution/031.Next Permutation
3 files changed +122
-1
lines changed Original file line number Diff line number Diff line change @@ -41,12 +41,12 @@ Complete solutions to Leetcode problems, updated daily.
41
41
| 015 | [ 3Sum] ( https://github.com/yanglbme/leetcode/tree/master/solution/015.3Sum ) | ` Array ` , ` Two Pointers ` |
42
42
| 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 ` |
43
43
| 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 ` |
44
45
| 046 | [ Permutations] ( https://github.com/yanglbme/leetcode/tree/master/solution/046.Permutations ) | ` Backtracking ` |
45
46
| 047 | [ Permutations II] ( https://github.com/yanglbme/leetcode/tree/master/solution/047.Permutations%20II ) | ` Backtracking ` |
46
47
| 062 | [ Unique Paths] ( https://github.com/yanglbme/leetcode/tree/master/solution/062.Unique%20Paths ) | ` Array ` , ` Dynamic Programming ` |
47
48
| 063 | [ Unique Paths II] ( https://github.com/yanglbme/leetcode/tree/master/solution/063.Unique%20Paths%20II ) | ` Array ` , ` Dynamic Programming ` |
48
49
| 075 | [ Sort Colors] ( https://github.com/yanglbme/leetcode/tree/master/solution/075.Sort%20Colors ) | ` Array ` , ` Two Pointers ` , ` Sort ` |
49
- 075.Sort Colors
50
50
| 082 | [ Remove Duplicates from Sorted List II] ( https://github.com/yanglbme/leetcode/tree/master/solution/082.Remove%20Duplicates%20from%20Sorted%20List%20II ) | ` Linked List ` |
51
51
| 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 ` |
52
52
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments