既然你诚心诚意的发问了,我就死乞白赖的写一下吧,写(捡)一个是一个,这条鱼在乎。
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
来一个图,思路就是从末尾开始找起,找到第一个【i-1】<【i】的值,在在i的右边序列中找到最接近nums【i】且大于它的数,也即是下图的a【j】,交换位置。同时把剩余的a【i-1】右边的序列reverse反转一波。自己动手写个例子比划比划一下就好。
题目来源于这里:https://leetcode-cn.com/problems/next-permutation/solution/
有个动图挺好理解的,为什么人家这么聪明呀,笨脑壳我是
class Solution {
public void nextPermutation(int[] nums) {
int i=nums.length-2;
while(nums[i+1]<=nums[i]){
i--;
}
if(i>=0){
int j=nums.length-1;
while(nums[j]<nums[i]){
j--;
}
swap(nums,i,j);
}
reverse(nums,i+1);
}
public void swap(int[] nums,int i,int j){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
public void reverse(int [] nums,int start){
int i=start;
int j=nums.length-1;
while(i<j){
swap(nums,i,j);
i++;
j--;
}
}
}