59 lines
1.1 KiB
Markdown
59 lines
1.1 KiB
Markdown
|
||
## 思路
|
||
|
||
一些同学可能手动写排列的顺序,都没有写对,那么写程序的话思路一定是有问题的了,我这里以1234为例子,把全排列都列出来。可以参考一下规律所在:
|
||
|
||
```
|
||
1 2 3 4
|
||
1 2 4 3
|
||
1 3 2 4
|
||
1 3 4 2
|
||
1 4 2 3
|
||
1 4 3 2
|
||
2 1 3 4
|
||
2 1 4 3
|
||
2 3 1 4
|
||
2 3 4 1
|
||
2 4 1 3
|
||
2 4 3 1
|
||
3 1 2 4
|
||
3 1 4 2
|
||
3 2 1 4
|
||
3 2 4 1
|
||
3 4 1 2
|
||
3 4 2 1
|
||
4 1 2 3
|
||
4 1 3 2
|
||
4 2 1 3
|
||
4 2 3 1
|
||
4 3 1 2
|
||
4 3 2 1
|
||
```
|
||
|
||
如图:
|
||
|
||
以求1243为例,流程如图:
|
||
|
||
<img src='../pics/31.下一个排列.png' width=600> </img></div>
|
||
|
||
对应的C++代码如下:
|
||
|
||
```
|
||
class Solution {
|
||
public:
|
||
void nextPermutation(vector<int>& nums) {
|
||
for (int i = nums.size() - 1; i >= 0; i--) {
|
||
for (int j = nums.size() - 1; j > i; j--) {
|
||
if (nums[j] > nums[i]) {
|
||
swap(nums[j], nums[i]);
|
||
sort(nums.begin() + i + 1, nums.end());
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
// 到这里了说明整个数组都是倒叙了,反转一下便可
|
||
reverse(nums.begin(), nums.end());
|
||
}
|
||
};
|
||
```
|