/**
如果数组都是降序(3 2 1)
那就直接改为升序返回(1 2 3)
不是
(5 8 7 6 4)
从后找出第一个升序对(i,j)(5 8)
j到len-1都是降序,在此中从后往前找出第一个大于nums[i]的数(6)
交换j和k(6 8 7 5 4)
再将j到len-1升序(6 4 5 7 8)
*/
class Solution {
public void nextPermutation(int[] nums) {
int len = nums.length;
if(len == 1) return;
//从后向前遍历
for(int i=len-2; i>=0 ; i--)
{
//寻找第一个升序对
if(nums[i] < nums[i+1])
{
int j = i+1;
//从len-1到nums[i+1]找大于num[i]的值的下标k
int k = findGTB(nums,j,len-1,nums[i]);
//交换i和k
swap(nums,i,k);
//将i+1到len-1升序
reverse(nums,j,len-1);
return;
}
}
//没有升序対,直接把数组改升序
reverse(nums,0,len-1);
return;
}
//从后往前找大于目标值的数的下标
public int findGTB(int[] nums, int begin, int end, int target)
{
while(end>=begin)
{
if(nums[end] > target)
return end;
end--;
}
return 0;
}
public void swap(int[] nums, int left, int right)
{
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
public void reverse(int[] nums, int left, int right)
{
while(left<right)
swap(nums,left++,right--);
}
}
leetCode 31 下一个排列
最新推荐文章于 2024-08-17 20:25:49 发布