31_下一个排列[MEDIUM]
约 356 字大约 1 分钟
2026-03-23
给你一个整数数组 nums ,找出 nums 的下一个排列。
arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]解题思路
- 从右往左,找到第一个
nums[i] < nums[i+1]的数 - 再次从右往左,找到第一个
nums[j] > nums[i]的数 - 一旦找到,交换
i和j - 反转
i后面的数
Java实现
public void nextPermutation(int[] nums) {
int n = nums.length;
if (n <= 1){
return;
}
int pivotIndex = -1;
// 1. 从右往左,找到第一个 nums[i] < nums[i+1] 的数
for (int i = n-2; i >= 0; i--){
if (nums[i] < nums[i+1]){
pivotIndex = i;
break;
}
}
// 2. 再次从右往左,找到第一个 nums[j] > nums[i](即pivotIndex) 的数
if (pivotIndex > -1){
for (int j = n-1; j > pivotIndex; j--){
if (nums[j] > nums[pivotIndex]){
// 3. 一旦找到,交换 i 和 j
swap(nums, j, pivotIndex);
break;
}
}
}
// 4. 反转 i 后面的数
reverse(nums, pivotIndex+1, n-1);
}
private void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
private void reverse(int[] nums, int left, int right){
while (left < right){
swap(nums, left, right);
left++;
right--;
}
}