LeetCode Solutions
31. Next Permutation
Time: $O(n)$ Space: $O(1)$
class Solution {
public:
void nextPermutation(vector<int>& nums) {
const int n = nums.size();
// From back to front, find the first num < nums[i + 1]
int i;
for (i = n - 2; i >= 0; --i)
if (nums[i] < nums[i + 1])
break;
// From back to front, find the first num > nums[i], swap it with nums[i]
if (i >= 0)
for (int j = n - 1; j > i; --j)
if (nums[j] > nums[i]) {
swap(nums[i], nums[j]);
break;
}
// Reverse nums[i + 1..n - 1]
reverse(nums, i + 1, n - 1);
}
private:
void reverse(vector<int>& nums, int l, int r) {
while (l < r)
swap(nums[l++], nums[r--]);
}
};
class Solution {
public void nextPermutation(int[] nums) {
final int n = nums.length;
// From back to front, find the first num < nums[i + 1]
int i;
for (i = n - 2; i >= 0; --i)
if (nums[i] < nums[i + 1])
break;
// From back to front, find the first num > nums[i], swap it with nums[i]
if (i >= 0)
for (int j = n - 1; j > i; --j)
if (nums[j] > nums[i]) {
swap(nums, i, j);
break;
}
// Reverse nums[i + 1..n - 1]
reverse(nums, i + 1, n - 1);
}
private void reverse(int[] nums, int l, int r) {
while (l < r)
swap(nums, l++, r--);
}
private void swap(int[] nums, int i, int j) {
final int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
n = len(nums)
# From back to front, find the first num < nums[i + 1]
i = n - 2
while i >= 0:
if nums[i] < nums[i + 1]:
break
i -= 1
# From back to front, find the first num > nums[i], swap it with nums[i]
if i >= 0:
for j in range(n - 1, i, -1):
if nums[j] > nums[i]:
nums[i], nums[j] = nums[j], nums[i]
break
def reverse(nums: List[int], l: int, r: int) -> None:
while l < r:
nums[l], nums[r] = nums[r], nums[l]
l += 1
r -= 1
# Reverse nums[i + 1..n - 1]
reverse(nums, i + 1, len(nums) - 1)