31. Next Permutation
一、题目
1、审题
2、分析
给出一个数字型数组,改变其中的数字顺序,使得其为元素的所有数字组合后排序的下一个序列。
二、解答
1、思路:
a、从后向前看,比较得到首个比后面紧挨着的数字小的第一个数,记录其下标 i ,
若 i 为 0,即此时数字组合为最大值,只需翻转数组即可。
b、查找下标 i 之后的比下标 i 的元素大的最小的数字下标 j ,交换位置 i 与 j 的元素;
c、下标 i +1 开始的元素进行从小到大排序
class Solution { public void nextPermutation(int[] nums) { int len = nums.length; int i = len - 1; for (; i > 0; i--) { if(nums[i-1] < nums[i]) break; } if(i == 0) { // 该数为组成的最大值 for (int j = 0; j < len / 2; j++) { int tmp = nums[j]; nums[j] = nums[len - j - 1]; nums[len - j - 1] = tmp; } return; } int iMin = nums[i-1], iMax = nums[i]; // 找出比 i-1 大的最小的数下标 index int index = i; for (int j = i + 1; j <= len -1; j++) { if(nums[j] > iMin && nums[j] < iMax) { iMax = nums[j]; index = j; } } int tmp = nums[i - 1]; // 交换 index 与 i-1 数 nums[i - 1] = nums[index]; nums[index] = tmp; // 排序, i 及 i之后数字从小到大排序 for (int j = i; j < len - 1; j++) { int swapTmp = nums[j]; index = j; for (int k = j + 1; k < len ; k++) { if(swapTmp > nums[k]) { swapTmp = nums[k]; index = k; } } if( index != j) { nums[index] = nums[j]; nums[j] = swapTmp; } } } }