【leetcode】31. (Medium)Next Permutation(JAVA)

本文深入解析了求解数组全排列的下一个排列的算法实现,通过示例代码详细说明了如何找到并交换元素以生成下一个更大的排列,适用于完全倒序数组的特殊情况处理也一并讨论。

题目链接

这道题是要你求一个数组全排列(permutation)的下一个排列,没有什么算法

参考的题目解析:
https://www.cnblogs.com/grandyang/p/4428207.html
http://www.cnblogs.com/eudiwffe/p/6260699.html

需要注意的是,如果是全倒序就要全部反过来直接输出,比如321是全倒序,要输出123;511是全倒序,要输出115。

提交代码:

class Solution {
	public void nextPermutation(int[] nums) {
		if(nums.length==0||nums.length==1)	return;
		
		int pos,tmp,j=nums.length-1,i=j-1;
		
		//find i and j
		while(nums[i]>=nums[j]&&i>0) 
			i--;j--;
		
		if(nums[i]>nums[j]) {  //全是逆序
			for(pos=0;pos<nums.length/2;pos++) {
				tmp=nums[pos];
				nums[pos]=nums[nums.length-1-pos];
				nums[nums.length-1-pos]=tmp;
			}
			return;
		}
		
		
		//find k
		int k=nums.length-1;
		for(pos=nums.length-1;pos>=j;pos--) {  
			if(nums[pos]>nums[i]) {
				k=pos;
				break;
			}
		}
		
		//swap i and k
		tmp=nums[i];
		nums[i]=nums[k];
		nums[k]=tmp;
		
		//converse (i,end)
		for(pos=1;pos<=(nums.length-i)/2;pos++) {
			tmp=nums[i+pos];
			nums[i+pos]=nums[nums.length-pos];
			nums[nums.length-pos]=tmp;
		}
	}
}

运行结果:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值