Problem Description
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (i.e., sorted in ascending order).
The replacement must be in place and use only constant extra memory.
Examples
Example 1: Input: nums = [1,2,3] Output: [1,3,2] Example 2: Input: nums = [3,2,1] Output: [1,2,3] Example 3: Input: nums = [1,1,5] Output: [1,5,1]
Python Solution
def nextPermutation(nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# Find first decreasing element from right
i = len(nums) - 2
while i >= 0 and nums[i] >= nums[i + 1]:
i -= 1
if i >= 0:
# Find number just larger than nums[i]
j = len(nums) - 1
while j >= 0 and nums[j] <= nums[i]:
j -= 1
nums[i], nums[j] = nums[j], nums[i]
# Reverse the subarray after index i
left = i + 1
right = len(nums) - 1
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
Java Solution
class Solution {
public void nextPermutation(int[] nums) {
// Find first decreasing element from right
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
// Find number just larger than nums[i]
int j = nums.length - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
// Reverse the subarray after index i
reverse(nums, i + 1);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start) {
int left = start, right = nums.length - 1;
while (left < right) {
swap(nums, left, right);
left++;
right--;
}
}
}
C++ Solution
class Solution {
public:
void nextPermutation(vector& nums) {
// Find first decreasing element from right
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
// Find number just larger than nums[i]
int j = nums.size() - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
swap(nums[i], nums[j]);
}
// Reverse the subarray after index i
reverse(nums.begin() + i + 1, nums.end());
}
};
JavaScript Solution
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var nextPermutation = function(nums) {
// Find first decreasing element from right
let i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
// Find number just larger than nums[i]
let j = nums.length - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
[nums[i], nums[j]] = [nums[j], nums[i]];
}
// Reverse the subarray after index i
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
[nums[left], nums[right]] = [nums[right], nums[left]];
left++;
right--;
}
};
C# Solution
public class Solution {
public void NextPermutation(int[] nums) {
// Find first decreasing element from right
int i = nums.Length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
// Find number just larger than nums[i]
int j = nums.Length - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
Swap(nums, i, j);
}
// Reverse the subarray after index i
Reverse(nums, i + 1);
}
private void Swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void Reverse(int[] nums, int start) {
int left = start, right = nums.Length - 1;
while (left < right) {
Swap(nums, left, right);
left++;
right--;
}
}
}
Complexity Analysis
- Time Complexity: O(n) where n is the length of the input array
- Space Complexity: O(1) as we modify the array in-place
Solution Explanation
This solution finds the next lexicographically greater permutation. Here's how it works:
- Find the first pair of adjacent numbers from right where nums[i] < nums[i+1]
- If such pair exists:
- Find the smallest number greater than nums[i] to its right
- Swap these numbers
- Reverse all numbers after index i to get the smallest arrangement
Key points:
- The solution modifies the array in-place
- Uses constant extra space
- Handles all edge cases properly
- Returns the smallest possible arrangement if no greater permutation exists