题意: 找出当前数组排列的下一个排列,按升序,如果没有下一个排列就输出最小的排列
思路:倒序寻找升序序列直到某个元素不满足逆升序为止,然后交换该元素与其后面比他大的最小元素,最后将后续元素按升序排序即可
代码:
思路:倒序寻找升序序列直到某个元素不满足逆升序为止,然后交换该元素与其后面比他大的最小元素,最后将后续元素按升序排序即可
代码:
public void nextPermutation(int[] num) {
int j = num.length - 1;
int i = j - 1;
boolean find = false;
while(i >= 0){//找到第一个非逆降序的元素
if(num[i] >= num[j]){
j --;
i --;
}else {
find = true;
break;
}
}
int biggerMin = num[i + 1];//后续序列最大的中间的最小值
int biggerIndex = i + 1;
if(find){
for(int k = j; k < num.length; ++ k){
if(num[k] > num[i] && num[k] < biggerMin){
biggerMin = num[k];
biggerIndex = k;
}
}
num[biggerIndex] = num[i];
num[i] = biggerMin;
Arrays.sort(num, i+1, num.length);//对交换后的后的后半段元素从小到大排序
}else {
i = 0;
j = num.length - 1;
int temp;
while (i < j){//当前排列是最大的情况下 逆序(也就是输出最小的序列)
temp = num[i];
num[i] = num[j];
num[j] = temp;
i ++ ;
j -- ;
}
}
return;
}