# 31. Next Permutation¶

• Time: $O(n)$
• Space: $O(1)$
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 class Solution { public: void nextPermutation(vector& nums) { const int n = nums.size(); // From back to front, find the first number < 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 number > 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& nums, int l, int r) { while (l < r) swap(nums[l++], nums[r--]); } }; 
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Solution { public void nextPermutation(int[] nums) { final int n = nums.length; // From back to front, find the first number < 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 number > 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; } } 
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution: def nextPermutation(self, nums: List[int]) -> None: n = len(nums) # From back to front, find the first number < 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 number > 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)