我是小张同学,立志用最简洁的代码做最高效的表达


以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!

传送门——>Leecode大厂热题100道系列题解


问题描述

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]

示例 4:
输入:nums = [1]
输出:[1]

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100


思路

这道题是根据 维基百科 ,下图所示:

翻译过来:

  • 先找出最大的索引kkk满足nums[k]<nums[k+1]nums[k] < nums[k+1]nums[k]<nums[k+1],如果不存在,就翻转整个数组;
  • 再找出另一个最大索引lll满足nums[l]>nums[k]nums[l] > nums[k]nums[l]>nums[k];
  • 交换nums[l]nums[l]nums[l]和nums[k]nums[k]nums[k];
  • 最后翻转nums[k+1:]nums[k+1:]nums[k+1:]。

举个例子:

比如nums=[1,2,7,4,3,1]nums = [1,2,7,4,3,1]nums=[1,2,7,4,3,1],下一个排列是什么?

我们找到第一个最大索引是nums[1]=2nums[1] = 2nums[1]=2

再找到第二个最大索引是nums[4]=3nums[4] = 3nums[4]=3

交换,nums=[1,3,7,4,2,1]nums = [1,3,7,4,2,1]nums=[1,3,7,4,2,1];

翻转,nums=[1,3,1,2,4,7]nums = [1,3,1,2,4,7]nums=[1,3,1,2,4,7]

完毕!

所以,

时间复杂度:O(n)O(n)O(n)

空间复杂度:O(1)O(1)O(1)

class Solution {public:void nextPermutation(vector<int>& nums) {bool flag = true;int len = nums.size();if(len == 1) return;                    // 特判int p = len - 2;while(p >= 0) {if(nums[p] < nums[p + 1]) {flag = false;for(int i = len-1; i > p; i--) {if(nums[i] > nums[p]) {swap(nums[p], nums[i]);reverse(nums.begin() + p + 1, nums.end());goto loop;}}}p--;}loop:;if(flag) reverse(nums.begin(), nums.end());return;}
};

Leecode31. 下一个排列——Leecode大厂热题100道系列相关推荐

  1. Leecode06. Z 字形变换——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  2. Leecode 21. 合并两个有序链表——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 题目描 ...

  3. Leecode15. 三数之和——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  4. Leecode11. 盛最多水的容器——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  5. Leecode22. 括号生成——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  6. Leecode20. 有效的括号——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  7. Leecode19. 删除链表的倒数第 N 个结点——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 题目描 ...

  8. Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  9. Leecode07. 整数反转——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

最新文章

  1. [spring-boot] 多环境配置
  2. Priority VS Bandwidth
  3. Redis主从配置及通过Keepalived实现Redis自动切换高可用
  4. 设计模式11-桥接模式
  5. 控制Java并行流的并行度
  6. npm设置http代理
  7. Redis那些事(一) — Redis简介
  8. 投资大佬都在看的一张报表
  9. SQL Server删除语句
  10. ELK下Kibana的使用
  11. HTML 教程(一文彻底搞懂HTML)
  12. 分享一个代码合并工具
  13. 乐高集团携手合作伙伴在中国推广乐高盲文积木颗粒公益项目
  14. 电子行报告:从海外龙头发展历程看国内半导体设备企业投资价值
  15. PC端打不开微信公众号文章、微信图片加载超缓慢的处理方法(最全的解决方法)
  16. emacs 启动页面定制
  17. Google GMS Crash 优化方案
  18. mysql查询成绩并排名_一条SQL语句实现查询出成绩名次排名
  19. 使用 awk 处理一个对齐问题
  20. 小米手机--刷机指南

热门文章

  1. Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap
  2. 高级数据结构与算法 | 回溯算法(Back Tracking Method)
  3. Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案
  4. 推荐一款日志切割神器,好用到爆!!
  5. Scala与Java集合互转摘要
  6. 应用深度学习使用 Tensorflow 对音频进行分类
  7. 『每周观察』:“在线抓娃娃”开启新娱乐窗口
  8. 机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器
  9. c++实现单例类(懒汉与饿汉)
  10. ffmpeg内存模型及AVPacket和AVFrame API基本使用