LeetCode-31-Next Permutation(找规律/证明)-Medium
2016-01-02 12:28
489 查看
题意理解:
更换先前的vector中的内容,使得新vector中内容组成的字符串str2,为先前vector中内容组成的字符串str1,按字典序字母排列的后一个排列(简单的说就是str2为按字典序排列中,比str1大的组合中的最小组合)。
题目分析:
1. 注意不能分配新的内存空间;
2. 找规律,假设vector中的内容为[c0, c1, c2, c3],从结尾向开始方向查找,
1)查找到第一个Cm>Cm-1的字符;
2)将Cm-Cn中的字符按从小到大顺序排序,并找到第一个比Cm-1大的字符Cr;
3)交换Cm-1和Cr;
解题代码:
更换先前的vector中的内容,使得新vector中内容组成的字符串str2,为先前vector中内容组成的字符串str1,按字典序字母排列的后一个排列(简单的说就是str2为按字典序排列中,比str1大的组合中的最小组合)。
题目分析:
1. 注意不能分配新的内存空间;
2. 找规律,假设vector中的内容为[c0, c1, c2, c3],从结尾向开始方向查找,
1)查找到第一个Cm>Cm-1的字符;
2)将Cm-Cn中的字符按从小到大顺序排序,并找到第一个比Cm-1大的字符Cr;
3)交换Cm-1和Cr;
解题代码:
class Solution { public: void nextPermutation(vector<int>& nums) { int size=nums.size(); if(size<=1){ return; } vector<int>::iterator iter=nums.end(); bool flag=false; for(int i=size-1; i>0; i--){ iter--; if(nums[i]>nums[i-1]){ int t=nums[i-1]; reverse(iter, nums.end()); for(int j=i; j<size; j++){ if(t<nums[j]){ nums[i-1]=nums[j]; nums[j]=t; break; } } flag=true; break; } } if(!flag){ reverse(nums.begin(), nums.end()); } } };
相关文章推荐
- EAX、ECX、EDX、EBX寄存器的作用
- 为什么设计师也要学会判断优先级?
- 第八届河南省赛D.引水工程(kruthcra+prime)
- centos下一台机器多个Mysql实例
- 用OneProxy部署MySQL数据库的读写分离
- NLP常用信息资源
- 第十四周项目2-二叉树排序树中查找的路径
- JavaScript客户端检测技术
- VimDesktop 配置
- DP 动态规划Dynamic programming
- ifcfg, ip,ss及配置文件
- Linguistic Data Consortium (LDC)
- 【线性代数】 07 - 线性函数
- Thread和Service应用场合的区别
- tomcat学习
- 枚举enum用法总结
- 【转】Codeforces GoodBye2015 New Year and Three Musketeers Codeforces 611E(贪心)
- 2、创建File类对象
- python之获取微信服务器的ip地址
- <LeetCode OJ>Binary Tree Preorder Traversal【144】