• 刷题-力扣-31. 下一个排列


    31. 下一个排列

    题目链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/next-permutation/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目描述

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
    必须 原地 修改,只允许使用额外常数空间。

    示例 1:

    输入:nums = [1,2,3]
    输出:[1,3,2]
    

    示例 2:

    输入:nums = [3,2,1]
    输出:[1,2,3]
    

    示例 3:

    输入:nums = [1,1,5]
    输出:[1,5,1]
    

    示例 4:

    输入:nums = [1]
    输出:[1]
    

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 100

    题目分析

    1. 根据题目描述找出比当前排列大一点儿的排列
    2. 我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。
    3. 同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。

    代码

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int len = nums.size() - 1;
            int min;
            int max;
            for (min = len; min > 0; --min) {
                if (nums[min - 1] < nums[min]) break;
            }
            if (min == 0) {
                reverse(nums.begin(), nums.end());
                return;
            }
            min -= 1;
            // printf("%d", min);
            for (max = len; max > min; --max) {
                if (nums[min] < nums[max]) break;
            }
            // printf("%d", max);
            int temp = nums[max];
            nums[max] = nums[min];
            nums[min] = temp;
            reverse(nums.begin() + min + 1, nums.end());
            return;
        }
    };
    
  • 相关阅读:
    机器任务——最小点覆盖
    树的统计
    农夫约翰
    关押罪犯
    题单
    加分二叉树(递归,区间DP)
    [动态规划] 斜率优化DP
    [树形DP] 换根DP
    [期望DP][SCOI2008] 奖励关
    [数位DP][AHOI2009] Luogu P4127 同类分布
  • 原文地址:https://www.cnblogs.com/HanYG/p/14837023.html
Copyright © 2020-2023  润新知