LeetCode(31)--Next Permutation
来源:互联网 发布:登录无限极网络 编辑:程序博客网 时间:2024/06/05 07:31
就是将这个数组排列成下一个较大的数,如果已经是最大的了,就排列成最小的数。
我是这么想的,从后往前遍历数组,如果一直是逐渐增大的,则已经是最大的了,如果出现了一个下降的数,那么遍历就到此为止,因为这已遍历的部分就可以排列成下一个较大的数了
当找到这个突然下降的点A后,由于它后面已经排列为“最大”,即从前往后一直变小,所以应该从后面比A大的数中找最小的点B,然后A和B交换位置。这个时候以B开头,后面也是最大的排列,由于需要找下一个较大的数,应该把B后面的排列改为最小的,只需要将后面的数组顺序逆转一下即可。如果一直没有找到下降的点,则全部逆转即可。
举个例子:
6 5 4 8 7 5 1
首先肯定从后面开始看,1和5调换了没有用。7、5和1调换了也没有效果,因此而发现了8、7、5、1是递减的。如果想要找到下一个排列,找到递增的位置是关键。因为在这里才可以使其增长得更大。于是找到了4,显而易见4过了是5而不是8或者7更不是1。因此就需要找出比4大但在这些大数里面最小的值,并将其两者调换。那么整个排列就成了:6 5 5 8 7 4 1然而最后一步将后面的8 7 4 1做一个递增。
代码实现如下:
class Solution {public: void nextPermutation(vector<int>& nums) { if (nums.empty()||nums.size()==1)return; int len = nums.size(); int i = 0; for (i = len - 1; i > 0; i--) { //找到中间突然下降的点A if (nums[i - 1] >= nums[i])continue; else{ //找到后面比A大的数字中最小的B for (int j = len - 1; j >= i; j--) { if (nums[j] <= nums[i - 1])continue; else{ int temp = nums[i - 1]; nums[i - 1] = nums[j]; nums[j] = temp; } break; } } break; } sort(nums.begin()+i, nums.end()); }};
阅读全文
0 0
- LeetCode 31: Next Permutation
- [leetcode 31] Next Permutation
- LeetCode(31) Next Permutation
- LeetCode---(31) Next Permutation
- leetcode 31 -- Next Permutation
- leetcode 31: Next Permutation
- LeetCode(31) Next Permutation
- LeetCode-31 Next Permutation
- Leetcode#31||Next Permutation
- LeetCode 31: Next Permutation
- LeetCode(31)-Next Permutation
- leetcode(31) Next Permutation
- LeetCode 31 - Next Permutation
- 【leetcode】【31】Next Permutation
- LeetCode-31:Next Permutation
- leetcode (31) Next Permutation
- LeetCode 31 Next Permutation
- leetcode-31-Next Permutation
- jenkins中使用脚本来节省资源空间和使用shell提取文件名或目录名的方法
- 大龄程序员的未来在何方
- 关于Context的子类
- 独木舟上的旅行
- linux最小系统无法输入中文
- LeetCode(31)--Next Permutation
- Mysql通过IP连接授权
- Java编译、运行、打包、解决依赖等会用到的命令
- C
- mybatis使用group by返回sum,count数据
- 前端开发静态文件自动添加版本号解决方案
- 程序的机器级表示(1)--引入
- 汪汀总经理当选北京湖北企业商会理事
- JQuery学习笔记(四)