这里主要是记录一些我做这个题遇到的问题及解决办法
1.思路
1.1 分析:
这个题的关键是找到比这个序列大一点点的下一个序列,例如比123大的序列有132,213,231,312,321
那么只有132是刚好比123大一点点,如何找呢?可以用先找到要替换哪一位,这个就是从后往前依次两位
进行比较大小,如果发现后面一位是大于前面一位,那么前面一位就是要替换的数.
例如:1,2,3,4,6,7,5:其中5<7,7>6,那么6这一位置就是要替换的数,但是用哪个来替换呢?
可以先把6后面的数进行升序排列变成:5,7,只要从前往后把升序的序列找到第一个比6大的,也就是7与其
进行替换,那么替换后的结果就是我们要的结果:其中心思想就是如此。
1.2 整体流程图
分类的依据是对于长度为1的不好处理,对于典型的例如最大字典序可以直接进行求解,其它类型用上述中心思想来解决:
2.程序代码及注释:
代码效率低,还有改进空间、排序使用的是稍微改进的冒泡排序
void ArrSort(int* nums, int numsSize, int start);
void nextPermutation(int* nums, int numsSize) {
int i, k, min;
int flag = 0;
i = numsSize - 1;
if(i==0){}
else{
while (nums[i] <= nums[i - 1]) // 例如:5 4
{
i--;
if (i == 0) {
// 此时满足最大字典序
ArrSort(nums, numsSize, 0);
flag = 1;
break;
}
}
// 结束循环的条件是nums[i]>nums[i-1] 例如:6 8
if (flag == 0)
{
k = i - 1; // 准备替换的数的下标
ArrSort(nums, numsSize, k + 1); // 先升序,然后找一个比这个大的
min = nums[i - 1];
for (i = i; i < numsSize; i++)
{
if (nums[i] > min)
{
nums[k] = nums[i];
nums[i] = min;
break;// 已经找到最小的,则开始替换:且结束
}
}
}
}
}
// 从小到大排序
void ArrSort(int* nums, int numsSize, int start) {
int i, j, t;
for (i = start; i < numsSize; i++) {
for (j = i + 1; j < numsSize; j++) {
if (nums[i] > nums[j]) {
t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
}
}