2021年03月19日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
本文目录
1. 问题简介
2. 题解(为什么要这么做?)
这道题最重要的是理解思路,思考为什么这么做之后就能得到下一个排列? 下面是具体思路:
为什么要这么做?
我们最主要的目的就是找到一个数 ans
,其满足以下两个条件:
条件1: 比原数 num
大;
条件2:足够小。
当我们按照上面的思路做了之后,就能满足这两个条件。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
const int n = nums.size();
if(n==1) return;
int k = n-2;
// 1. 先找到k,满足 nums[k] < nums[k+1]
while(k>=0 && nums[k]>=nums[k+1]) --k;
if(k>=0){
int l = n-1;
// 2. 再先找到l,满足 nums[l] > nums[k]
while(l>=k+1 && nums[l]<=nums[k]) --l;
// 3. 交换 nums[l] 和 nums[k](满足条件1:比原数 num 大)
swap(nums[k],nums[l]);
}
// 4. 翻转 nums[k+1:](满足条件2:足够小)
reverse(nums.begin()+k+1,nums.end());
}
};
参考文献
https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-powcai/