// 之前觉得从后往前找到一个a[i] > a[i - 1]将其调换就行
// 直到交了以后发现, 1 3 2 样例过不去
// 看了下解法,才发现原来不是将a[i] 与 a[i - 1]交换
// 而是要在a[i] ~ a[n]这部分找到刚好大于a[i- 1]的这个数index
// 将a[index]与a[i - 1]交换,并将 i~n处变为升序
//重温一下: 2022年4月13日
//思路:
// 因为要找下一个大的,
// 首先找到最右边的降序的开头的前一个
// 比如: 2 3 1 找到 2所在位置0
// 然后找到右边降序中从右往左第一个大于2的
// 将两者交换位置后, 从0之后排个序就行了
// 注意到 两者交换之后,后面一定仍然是降序
// 如果不是降序的话0所在位置之后会有比2更小的数
// 那么一开始找的就是0所在的位置了,而是0后面的位置
class Solution {
public void nextPermutation(int[] nums) {
int n = nums.length;
int index = -1;
if (n == 1) return ;
for (int i = n - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]){
index = i;
break;
}
}
if (index == -1) {
int left = 0;
int right = n - 1;
while(left < right) {
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;;
right--;
}
return ;
}
int big = -1;
for (int i = n - 1; i > index ;i --) {
if (nums[i] > nums[index]){
big = i;
break;
}
}
int tmp = nums[index];
nums[index] = nums[big];
nums[big] = tmp;
int left = index + 1;
int right = n - 1;
while(left < right) {
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
}
LeetCode 31 下一个排列
于 2019-04-28 22:13:02 首次发布