leetcode 31. Next Permutation

import java.util.Arrays;

//Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
//If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
//The replacement must be in-place, do not allocate extra memory.
//Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
//1,2,3 → 1,3,2
//3,2,1 → 1,2,3
//1,1,5 → 1,5,1
//题意:输出全排列的下一个组合
//1.换 2.找最接近的 3.换 4.升序

public class Solution {
	 
	public static void main(String[] args) {
		int[] input = {5,1,1};
		nextPermutation(input);
		for(int i = 0;i<input.length;i++){
			System.out.println(input[i]);
		}
	}
	
	public static void nextPermutation(int[] nums) {
		if(nums.length == 1){							//若输入数组中只有一个数,则直接返回
			return;
		}
		int i = nums.length-2;
		while(i>=0){									//找到要交换的第一个字符下标
			if(nums[i]<nums[i+1]) break;
			i--;
		}
		if(i == -1){									//若字符串是降序排列的,则输出全排列的第一种组合
			Arrays.sort(nums);
			return;
		}
		int change1 = i;								//change1,change2分别是交换的两个值的下标
		int change2 = 0;
		for(;i<nums.length;i++){						//找到比要交换第一个值大,且最接近的值,就是要交换的第二个值
			int temp = nums[i]-nums[change1];
			int cha = 100;
			if(temp<cha&&temp>0){
				cha = temp;
				change2 = i;
			}
		}		
		int temp = nums[change1];						//交换这两个值
		nums[change1] = nums[change2];
		nums[change2] = temp;
		for(int j = change1+1;j<nums.length-1;j++){		//交换之后第一个值下标之后的字符升序排序
			for(int k = j+1;k<nums.length;k++){
				if(nums[j]>nums[k]){
					int temp1 = nums[k];
					nums[k] = nums[j];
					nums[j] = temp1;
				}
			}
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值