Introduction
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)
Input
第一行给出整数个数n,第二行给出n个排列整数
Output
输出将给定数字序列重新排列成字典序中下一个更大的排列
Sample
input
3 1 2 3
output
1 3 2
Solution
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s=new Scanner(System.in); int nn=s.nextInt(); int[] nums=new int[nn]; for(int i=0;i<nn;i++){ nums[i]=s.nextInt(); } if (nums == null || nums.length == 0) return; int firstIndex = -1; for (int i = nums.length - 2; i >= 0; i--) { if (nums[i] < nums[i + 1]) { firstIndex = i; break; } } if (firstIndex == -1) { reverse(nums, 0, nums.length - 1); System.out.print(nums[0]); for(int i=1;i<nn;i++){ System.out.print(" "+nums[i]); } return; } int secondIndex = -1; for (int i = nums.length - 1; i >= 0; i--) { if (nums[i] > nums[firstIndex]) { secondIndex = i; break; } } swap(nums, firstIndex, secondIndex); reverse(nums, firstIndex + 1, nums.length - 1); System.out.print(nums[0]); for(int i=1;i<nn;i++){ System.out.print(" "+nums[i]); } } public static void reverse(int[] nums, int i, int j) { while (i < j) { swap(nums, i++, j--); } } public static void swap(int[] nums, int i, int i1) { int tmp = nums[i]; nums[i] = nums[i1]; nums[i1] = tmp; } }
Experience
字典序典型算法,要记住