Skip to content

Commit 79a3d3a

Browse files
committed
refactor Next Permutation
1 parent 5f3d828 commit 79a3d3a

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

go/next_permutation.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
//lint:file-ignore U1000 Ignore all unused code
22
package main
33

4-
import "sort"
5-
64
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--
2016
}
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]
2125
}
22-
sort.Slice(nums, func(a, b int) bool {
23-
return nums[a] < nums[b]
24-
})
2526
}

0 commit comments

Comments
 (0)