[C++] LeetCode 31. 下一个排列
2018-03-31 12:54
555 查看
题目
实现获取下一个排列函数,这个算法需要将数字重新排列成字典序中数字更大的排列。如果不存在更大的排列,则重新将数字排列成最小的排列(即升序排列)。
修改必须是原地的,不开辟额外的内存空间。
这是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1
解析
获取下一个全排列,如果想偷懒可以直接用函数next_permutation。
代码如下:
class Solution { public: void nextPermutation(vector<int>& nums) { next_permutation(nums.begin(),nums.end()); } };
从后往前遍历数组,找到当前节点右侧第一个比当前节点大的数,交换他们,然后使当前右侧有序即可。
假设数组
nums长度为n(从0开始编号),数组中
nums[i]到第
nums[n-1]逆序(降序排列),且
nums[i-1]<nums[i],则下一个全排列时只需要考虑
nums[i-1]到nums[n-1]即可,在
i-1右侧找到第一个大于
nums[i-1]的数,交换他们顺序,则后面升序排列就是最小的数,即下一个全排列
代码
class Solution { public: void nextPermutation(vector<int>& nums) { int len=nums.size(); for(int i=len-1;i>=0;i--){ for(int j=len-1;j>i;j--){ if(nums[i]<nums[j]){ swap(nums[i],nums[j]); sort(nums.begin()+i+1,nums.end()); return ; } } } reverse(nums.begin(),nums.end()); } };
相关文章推荐
- 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 (下一个排列)
- [C++]LeetCode: 79 Next Permutation (下一个排列,常见面试题)
- leetcode解题之31. Next Permutation java 版(下一个排列)
- [LeetCode] Next Permutation 下一个排列
- leetcode:Next Permutation (求下一个排列) 【面试算法题】
- 下一个排列问题 C++代码
- 【leetcode】31. Next Permutation 数字序列的所有组合中比给定串大的下一个最小的串
- LeetCode | Next Permutation(下一个排列)
- [C++]LeetCode: 31 Binary Tree Level Order Traversal
- LeetCode(31): Next Permutation (C++)
- 31.Next Permutation 下一个排列