[LeetCode]Next Permutation下一个排列问题
来源:互联网 发布:索隆 知乎 编辑:程序博客网 时间:2024/04/28 09:29
当初把自己的代码贴在了discuss上,最近有人关于代码部分问了一些问题,现在总结一下这个题目吧。
一、问题描述
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
给定一个排列,求出它的下一个排列。
二、代码:先贴下代码吧,根据代码讲解一下我的思路
O(n):
int befoPos = -1, afterPos = -1; for (int i = nums.size()-2; i >= 0; --i) { if (nums[i] < nums[i+1]) { befoPos = i; break; } } if (befoPos == -1) { reverse(nums.begin(), nums.end()); return; } for (int i = nums.size()-1; i >= 0; --i) { if (nums[befoPos] < nums[i]) { afterPos = i; break; } } swap(nums[befoPos], nums[afterPos]); reverse(nums.begin()+befoPos+1, nums.end());
Q: Hi,I have tried almost the same solution as yours. The only difference is that I used sort(nums.begin()+befoPos+1, nums.end()); instead of reverse(). But both are right, I don't know why this happens, do you know why?
A: For example, the given permutation is 3,4,1,6,5,2, and you got 1 at befoPos which is the first element from end that satisfies descending order with its after element. All the elements after befoPos is descending(including equals) so they are all larger than nums[befoPos].
Then you want to deal the elements from 6 to 2. In the second loop, you need find the first element larger than nums[befoPos] from end and swap it with nums[befoPos]. As I explain above, it is the last element of nums and also the smallest element between befoPos+1 to end.
Now, its clear that the elements from befoPos+1 are descending. The only thing you need to do is reverse them. No matter you use reverse or sort, the aim is to generate a ascending order from befoPos+1 to end. Of course I think reverse is faster. ^_^
- [LeetCode]Next Permutation下一个排列问题
- LeetCode | Next Permutation(下一个排列)
- LeetCode 31 Next Permutation(下一个排列)
- LeetCode 31. Next Permutation(下一个排列)
- LeetCode 31 Next Permutation (下一个排列)
- LeetCode[31] Next Permutation 求下一个排列
- leetcode:31. Next Permutation 下一个排列
- 下一个排列(Next Permutation)
- Next Permutation 下一个排列
- Next Permutation 下一个排列
- 31.Next Permutation 下一个排列
- leetcode:Next Permutation (求下一个排列) 【面试算法题】
- LeetCode OJ 之 Next Permutation(下一个排列)
- Leetcode #31. Next Permutation 下一个全排列 解题报告
- Next Permutation-leetcode下一个排列组合
- Next Permutation 寻找下一个排列数
- Next Permutation下一个全排列序列
- 31. Next Permutation (下一个排列)
- 内联函数和宏定义的区别
- 4.30
- xUtils开源库导入AS失败,换成导入xUtils3开源库
- HTML5移动端meta标签中viewpoint简介
- Android 网络请求方法
- [LeetCode]Next Permutation下一个排列问题
- 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
- POJ 1201 差分约束系统
- 安卓动态调试七种武器之长生剑 - Smali Instrumentation
- Java EE 之Hibernate初步接触 one-to-many
- JSON.stringify的使用
- Lab 3:自行车码表
- PAT-B 1030. 完美数列
- poj 初级训练计划数据结构总结