【力扣】31. 下一个排列--个人作答思路分析-力扣-C语言

这里主要是记录一些我做这个题遇到的问题及解决办法

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;
           }
       }
   }
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第 296 章 使用 Javascript 的 LeetCode 解决方案 var :smiling_face_with_sunglasses: = Easy , :neutral_face: = Medium , :fearful_face: = Hard 1 :neutral_face: 二和 2 :neutral_face: 两个数字相加 3 :neutral_face: 无重复字符的最长子串 4 :fearful_face: 两个有序数组的中位数 5 :neutral_face: 最长回文子串 6 :smiling_face_with_sunglasses: 之字形转换 7 :smiling_face_with_sunglasses: 反转整数 8 :smiling_face_with_sunglasses: 字符串到整数 (atoi) 9 :smiling_face_with_sunglasses: 回文数 10 :fearful_face: 正则表达式匹配 11 :neutral_face: 盛水最多的容器 12 :neutral_face: 整数转罗马 13 :smiling_face_with_sunglasses: 罗马到整数 14 :smiling_face_with_sunglasses: 最长公共前缀 15 :neutral_face: 3总和 16 :neutral_face: 3和最近 17 :neutral_face: 电话号码的字母组合 18 :neutral_face: 4总和 19 :smiling_face_with_sunglasses: 从列表末尾删除第 N 个节点 20 :smiling_face_with_sunglasses: 有效括号 21 :smiling_face_with_sunglasses: 合并两个排序列表 22 :neutral_face: 生成括号 23 :fearful_face: 合并 k 个排序列表 24 :neutral_face: 成对交换节点 25 :fearful_face: k-Group 中的反向节点 26 :smiling_face_with_sunglasses: 从排序数组中删除重复项 27 :smiling_face_with_sunglasses: 删除元素 28 :smiling_face_with_sunglasses: 实现 strStr() 29 :neutral_face: 两个整数相除 30 :fearful_face: 连接所有单词的子串 31 :neutral_face: 下一个排列 32 :fearful_face: 最长有效括号 33 :fearful_face: 在旋转排序数组中搜索 34 :neutral_face: 搜

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值