next_permutation的简单实现

发布时间 2023-07-28 18:12:44作者: WYMr4him

next_permutation的简单实现

​ 首先需要从后往前找到第一对数字满足nums[i]<num[j], i<j. 此时记下这个i为l, 在从后往前找到第一个大于nums[l]的数字, 下标记为r. 此时交换nums[l], nums[r]. 然后对数组内l以后的内容进行反转. 如果找不到满足第一个条件的l, 则对全部数组进行反转.

void nextPermutation(vector<int>& nums) {
    int n = nums.size();
    int l = -1, r = -1;
    for (int i = n - 2; i >= 0; --i) {
        if (nums[i] < nums[i + 1]) {
            l = i;
            break;
        }
    }
    if (l != -1) {
        for (int i = n - 1; i >= 0; --i) {
            if (nums[i] > nums[l]) {
                r = i;
                break;
            }
        }
        swap(nums[l], nums[r]);
    }
    reverse(nums.begin() + l + 1, nums.end());
}