实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解题思路:
- 从倒数第二个开始与后面的数字进行比较,如果存在比它大的且是比它大的数据集合中的最小数,则两数进行交换,并且将交换坐标后的数据,进行从小到大的排
2,3,4,6,1,8,7
从8开始与后面的数据进行比较,不存在比8大的数据,则继续开始从1与后面的数据进行比较,发现8和7都比1大,则选择集合中最小的7与1进行交换,然后将1后面的数据进行升序排序
2,3,4,6,7,1,8
2.如果比较完所有数据后不存在上述1的情况,则直接将数据进行升序排序。
package leetCode_5_14;
import java.util.Arrays;
/**
* @author : caoguotao
* @date 创建时间:2019年5月18日 下午8:30:31
* @version 1.0
* @parameter
* @since
* @return
*/
public class Solution31 {
public static void main(String[] args) {
int[] nums = {1,2,0,3,0,1,2,4};
nextPermutation(nums);
for (int i : nums) {
System.out.println(i);
}
}
public static void nextPermutation(int[] nums) {
for(int i = nums.length - 2; i >= 0 ; i--) {
int index = -1;
int num = Integer.MAX_VALUE;
for(int j = i + 1; j < nums.length; j++) {
if(nums[j] > nums[i] && nums[j] < num) {
index = j;
num = nums[j];
}
}
if(index != -1) {
nums[index] = nums[i];
nums[i] = num;
for(int j = i + 1; j < nums.length - 1; j++) {
for(int k = j + 1; k < nums.length; k++) {
if(nums[k] < nums[j]) {
int temp = nums[k];
nums[k] = nums[j];
nums[j] = temp;
}
}
}
return;
}
}
Arrays.sort(nums);
return;
}
}