牛客网:https://leetcode-cn.com/problems/next-permutation
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
这个题可以自己出4个数和5个数的例子,三个数比较难找到规律:
1,2,3,4,5
1,2,3,5,4
1,2,4,3,5
1,2,4,5,3
仔细看变红的一行和前一行粉色的:这是从后
1。找到第一个比前一个数大的数,然后从这开始到最后进行升序排列,来保证是大一丢丢,如我举例的粉色到红色,先找到5的位置,
然后从5开始升序排列变为临时序列:1,2,3,4,5
2. 然后在找到的位置的前一个位置即3的位置替换为被排好序的比三大的数,这样保证比原来大,即
1,2,3,4,5 -> 1 2 4 3 5
public void nextPermutation(int[] nums) {
if(nums.length<=1)return;//如果长度小于等于1不用找了
for(int i=nums.length-1;i>=1;--i) {
if(nums[i]>nums[i-1])
{
Arrays.sort(nums, i, nums.length);//进行我们的排序,保证后面找时只大一丢丢
for(int j=i;j<nums.length;++j) {
if(nums[j]>nums[i-1]) {//找到第一个比i-1位置大的数,保证较大
int tmp = nums[j];
nums[j] = nums[i-1];
nums[i-1] = tmp;
return ;
}
}
return ;
}
}
Arrays.sort(nums);
return ;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。