No.31 Next Permutation

这道题主要是全排列问题,输出某一个数字序列的全排列的下一个情况,比如说1,2,3全排列的下一个是1,3,2。

全排列的顺序按字典序排列,比如123的全排列顺序为:

123 132 213 231 312 321

当然最笨的方法还是生成所有全排列然后找。

这道题是有固定的算法的。

以下摘自网上的算法:

算法思想:举例如下

输入:1 4 6 5 3 2

step1:从右往左找到第一个破坏升序(非严格)的元素,此例中为4.记下标为 i

step2: 依然从右往左,找到第一个大于4的元素,此例中5,交换4和5.

step3:从i+1到最右端,逆置。6 4 3 2 to 2 3 4 6

so,1 5 2 3 4 6 即为所求。

把全排列的非递归算法滤一遍大概就懂了,因为全排列相当于从最小的数字开始固定在前面的某一位上,因此从右往左找的第一个逆序就是应该替换的位置,比如 1 2 3 4 5这个串,把1固定在最前面,后面全排序2 3 4 5,再把2固定到第二位,后面全排序3 4 5,以此类推,第一个出来的是12345,然后回溯的时候先把4和5颠倒变成12354。发现第一次逆序就说明后面的已经到全排列的最后一个了。

class Solution {
public:void nextPermutation(vector<int>& nums) {int pos=-1;int numLen=nums.size()-1;for(int i=numLen;i>0;i--){if(nums[i]>nums[i-1]){pos=i-1;break;}}if(pos==-1){reverse_num(nums,0,numLen);return;}int pos_num=nums[pos];for(int i=numLen;i>pos;i--){if(nums[i]>pos_num){nums[pos]=nums[i];nums[i]=pos_num;break;}}reverse_num(nums,pos+1,numLen);}void reverse_num(vector<int>& nums,int begin, int end){while(begin<end){int temp=nums[begin];nums[begin]=nums[end];nums[end]=temp;begin++;end--;}}
};

转载于:https://www.cnblogs.com/lilylee/p/5418480.html

[Leetcode]Next Permutation相关推荐

  1. 【字符串全排列】LeetCode 567. Permutation in String

    [字符串全排列]LeetCode 567. Permutation in String Solution1:[超时,未能AC] 得到s1的所有全排列组合,然后在s2中查找s1的全排列集合 因为超时,未 ...

  2. 【数字全排列】LeetCode 60. Permutation Sequence

    LeetCode 60. Permutation Sequence Solution0: 偷鸡摸狗的做法 class Solution {public:string getPermutation(in ...

  3. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  4. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  5. [leetcode] 题型整理之排列组合

    一般用dfs来做 最简单的一种: 17. Letter Combinations of a Phone Number Given a digit string, return all possible ...

  6. LeetCode 30. Substring with Concatenation of All Words

    LeetCode 30. Substring with Concatenation of All Words Solution1: 转载自:http://www.cnblogs.com/grandya ...

  7. Leetcode各种题型题目+思路+代码(共176道题)

    文章目录 第一章:Leetcode 每日很多题 1.Leetcode-1047 删除字符串中的所有相邻重复项 2.剑指 Offer 53 - I. 在排序数组中查找数字 I 3.Leetcode704 ...

  8. 字符串全排列的问题 python和c语言实现

    前言 这是一个的经典的问题 设计一个算法,输出一个字符串字符的全排列. 比如,String = "abc" 输出是"abc","bac",& ...

  9. 理解回溯算法——回溯算法的初学者指南

    0 前言 最近做了不少关于回溯法的算法题,积累了一些心得,这篇博文算是对回溯法的一个小总结. 1 回溯法简介 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法更高明 ...

最新文章

  1. R语言可视化图像中最常用的点样式(pch、plot characters)列表、ggpubr::show_point_shapes可视化最常用的点样式(pch)
  2. 大数据处理——Hadoop解析(一)
  3. 创建mini Linux
  4. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
  5. C# 如何转换生成长整型的时间
  6. H26L encoder.cfg参数分析
  7. vb.net 功能f8键事件_憋了三年,史上最全的 F1~F12 键用法整理出来了!
  8. NET中dictionary的一个小坑
  9. python模拟浏览器下载文件_模拟浏览器下载文件?
  10. jquery中几种层级选择器的详细说明
  11. python数学实验与建模_Python数学
  12. 大背景在网页设计中应用的30个优秀案例
  13. GitHub 的 10 分钟快速入门教程
  14. linux 16.04系统下载,Ubuntu下载16.04_Ubuntu Desktop32位标准版 - 系统之家
  15. js打开新页面的两种方式
  16. 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  17. python爬虫系列第六次笔记之验证码以及代理的使用
  18. Modern Robotics:机器人的构型空间
  19. 【小5聊】移动开发性能优化解决卡顿眩晕问题提高用户体验
  20. 微信浏览器唤起微信登录

热门文章

  1. jQuery Mobile 学习资料
  2. MySQL练习题和代码附录
  3. python如何统计累计每日的人数‘’_每日一练 | Data Scientist amp; Business Analyst amp; Leetcode 面试题 902...
  4. Python中的快捷键和注释方式
  5. vector java 复制_面试官:关于Java性能优化,你有什么技巧
  6. iphone全部机型_iPhone 上新,首次明确支持中国北斗
  7. 测试面试题集-Dubbo常见面试题
  8. Jmeter系列之Jmeter+Grafana+InfluxDB实时监控
  9. Messari:自2019年,DeFi领域因黑客攻击损失超2.84亿美元资产
  10. SAP License:OAYZ中的使用年限无法更改