|
1 | 1 | //lint:file-ignore U1000 Ignore all unused code
|
2 | 2 | package main
|
3 | 3 |
|
4 |
| -import "sort" |
5 |
| - |
6 | 4 | func nextPermutation(nums []int) {
|
7 |
| - for i := len(nums) - 1; i > 0; i-- { |
8 |
| - if nums[i-1] < nums[i] { |
9 |
| - candidate, candidateIndex := nums[i], i |
10 |
| - for j := i; j < len(nums); j++ { |
11 |
| - if nums[j] < candidate && nums[i-1] < nums[j] { |
12 |
| - candidate, candidateIndex = nums[j], j |
13 |
| - } |
14 |
| - } |
15 |
| - nums[i-1], nums[candidateIndex] = nums[candidateIndex], nums[i-1] |
16 |
| - sort.Slice(nums[i:], func(a, b int) bool { |
17 |
| - return nums[i+a] < nums[i+b] |
18 |
| - }) |
19 |
| - return |
| 5 | + if len(nums) < 2 { |
| 6 | + return |
| 7 | + } |
| 8 | + i := len(nums) - 2 |
| 9 | + for i >= 0 && nums[i] >= nums[i+1] { |
| 10 | + i-- |
| 11 | + } |
| 12 | + if i >= 0 { |
| 13 | + j := len(nums) - 1 |
| 14 | + for nums[j] <= nums[i] { |
| 15 | + j-- |
20 | 16 | }
|
| 17 | + nums[i], nums[j] = nums[j], nums[i] |
| 18 | + } |
| 19 | + reverse(nums[i+1:]) |
| 20 | +} |
| 21 | + |
| 22 | +func reverse(nums []int) { |
| 23 | + for i, j := 0, len(nums)-1; i < j; i, j = i+1, j-1 { |
| 24 | + nums[i], nums[j] = nums[j], nums[i] |
21 | 25 | }
|
22 |
| - sort.Slice(nums, func(a, b int) bool { |
23 |
| - return nums[a] < nums[b] |
24 |
| - }) |
25 | 26 | }
|
0 commit comments