力扣 -- 31. 下一个排列

力扣 -- 31. 下一个排列_第1张图片

题目链接: 31. 下一个排列 - 力扣(LeetCode)​​​​​​

简单来说,这道题的意思是给定一个数组,按这个数组数字的顺序组成一个整数,让我们找到以这个数组中的数字组成的比当前这个数字大的第一个数,能组成的比当前数更大的数字有很多个,要求找到最小的一个,如果找不出比当前数字更大的,即这个数就是当前数字组合的最大值,就把这个数组按升序排序,取最小的。例如[1,2,3]的下一个比123更大的数是132。[3,2,1]已经是这三个数字能组成的整数中的最大值,找不到更大的组合,那就把[3,2,1]按升序排序得到[1,2,3]就是答案。

解题思路:

力扣 -- 31. 下一个排列_第2张图片

参考代码如下,已经附上详细的解释,相信聪明的各位小伙伴都能看懂并学会这道题的哈

class Solution {
public:
    void nextPermutation(vector& nums) {
        //利用i和j下标从后往前查找能组成比所给nums组合更大的数
        int i = nums.size() - 2;
        int j = nums.size() - 1;

        //由于i是前一个元素的下标,j是后一个元素的下标,所以i是大于等于0的
        //j是大于0的
        while (i >= 0 && j > 0)
        {
            //由于我们是从后往前找的,所以如果前一个元素大于等于后一个元素,
            //说明从nums[i]开始往后的元素都是升序的,即最大的,所以i--,j--
            // 继续往前找,直到找到nums[i]= nums[j])
            {
                i--;
                j--;
            }
            else
            {
                break;
            }
        }

        //如果i<0,说明给定的这个组合就是这个数组元素所能组成的最大值,
        //找不到比这个数更大的组合了,将数组排成升序,返回最小值
        if (i < 0)
        {
            sort(nums.begin(), nums.end());
            return;
        }

        //找到的nums[i] tmp && nums[m] - tmp < min)
            {
                mini = m;
            }
        }

        //mini就是从i开始往后找到的比nums[i]大并且最小的数的下标,使nums[i]和
        //nums[mini]交换,具体实例可以结合上面例题的图片解释
        swap(nums[i], nums[mini]);

        //最后把nums[i]后面的数进行升序排序即可
        sort(nums.begin() + i +1, nums.end());


    }
};

以上就是这道题的详细的解答过程,你学会了吗?如果对你有所帮助,那就点点小心心点点关注呗,后期还会持续更新力扣上的经典题目哦,我们下期见!!!!!

你可能感兴趣的:(力扣经典面试题,leetcode,算法,数据结构,c++)