31.下一个排列

在这里插入图片描述
思路:
从右到左找出满足nums[m]<nums[m+1],如果不存在翻转整个数组;
在m索引后,找出nums[n]>nums[m];
交换nums[m]和nums[n]的位置,将m索引后数组从小到大排列;

class Solution {
private:
    //交换数组元素
    void swap(vector<int>& nums,int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
    //翻转数组
    void reverse(vector<int>& nums,int i){
        int start=i;
        int end=nums.size()-1;
        while(start<end){
            swap(nums,start,end);
            start++;
            end--;
        }
    }

public:
    void nextPermutation(vector<int>& nums) {
        //寻找逆序的两个数
        int i=nums.size()-2;
        while(i>=0 && nums[i+1]<=nums[i])
            i--; 
        if(i>=0){   //若存在,先交换元素
            int j=nums.size()-1;
            while(j>=0 && nums[j]<=nums[i])
                j--;
            swap(nums,i,j);
        }    
        reverse(nums,i+1);  //翻转整个数组
    }
};
发布了144 篇原创文章 · 获赞 0 · 访问量 1683

猜你喜欢

转载自blog.csdn.net/qq_43604517/article/details/104581874