Skip to content

Commit 82043fd

Browse files
committed
[Array] Update solution to Next Permutation
1 parent 3bb8109 commit 82043fd

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

Array/NextPermutation.swift

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,43 +9,36 @@
99

1010
class NextPermutation {
1111
func nextPermutation(_ nums: inout [Int]) {
12-
guard nums.count > 0 else {
12+
guard let violateIndex = findViolate(nums) else {
13+
nums.reverse()
1314
return
1415
}
1516

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() {
2023
if nums[i] > nums[i - 1] {
21-
violate = i - 1
22-
break
24+
return i - 1
2325
}
2426
}
2527

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
3629
}
3730

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+
}
4536
}
37+
38+
fatalError()
4639
}
4740

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])
5043
}
5144
}

0 commit comments

Comments
 (0)