9
9
10
10
class NextPermutation {
11
11
func nextPermutation( _ nums: inout [ Int ] ) {
12
- guard nums. count > 0 else {
12
+ guard let violateIndex = findViolate ( nums) else {
13
+ nums. reverse ( )
13
14
return
14
15
}
15
16
16
- var violate = - 1
17
-
18
- // find violate
19
- for i in stride ( from: nums. count - 1 , to: 0 , by: - 1 ) {
17
+ swap ( & nums, violateIndex, findLeastGreater ( nums, violateIndex) )
18
+ nums = nums [ 0 ... violateIndex] + nums[ ( violateIndex + 1 ) ... ] . reversed ( )
19
+ }
20
+
21
+ fileprivate func findViolate( _ nums: [ Int ] ) -> Int ? {
22
+ for i in ( 1 ..< nums. count) . reversed ( ) {
20
23
if nums [ i] > nums [ i - 1 ] {
21
- violate = i - 1
22
- break
24
+ return i - 1
23
25
}
24
26
}
25
27
26
- if violate != - 1 {
27
- for i in stride ( from: nums. count - 1 , to: violate, by: - 1 ) {
28
- if nums [ i] > nums [ violate] {
29
- swap ( & nums, i, violate)
30
- break
31
- }
32
- }
33
- }
34
-
35
- reverse ( & nums, violate + 1 , nums. count - 1 )
28
+ return nil
36
29
}
37
30
38
- func reverse< T> ( _ nums: inout [ T ] , _ start: Int , _ end: Int ) {
39
- var start = start, end = end
40
-
41
- while start < end {
42
- swap ( & nums, start, end)
43
- start += 1
44
- end -= 1
31
+ fileprivate func findLeastGreater( _ nums: [ Int ] , _ violateIndex: Int ) -> Int {
32
+ for i in ( violateIndex + 1 ..< nums. count) . reversed ( ) {
33
+ if nums [ i] > nums [ violateIndex] {
34
+ return i
35
+ }
45
36
}
37
+
38
+ fatalError ( )
46
39
}
47
40
48
- func swap< T> ( _ nums: inout [ T ] , _ p : Int , _ q : Int ) {
49
- ( nums [ p ] , nums [ q ] ) = ( nums [ q ] , nums [ p ] )
41
+ fileprivate func swap< T> ( _ nums: inout [ T ] , _ indexL : Int , _ indexR : Int ) {
42
+ ( nums [ indexL ] , nums [ indexR ] ) = ( nums [ indexR ] , nums [ indexL ] )
50
43
}
51
44
}
0 commit comments