列表

详情


NC194. 下一个排列

描述

给定一个数组,将数组重新排列,得到一系列数组排列S,请你从S中,找出恰好比当前数组排列字典序大于1的数组排列。
1.[1,2,3]的得到的数组排列S有:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]。
2.该题数组排列的字典序大小排序规则:2个数组排列的元素按顺序比较,直到数组元素不相等为止,不相等的第一个元素,谁的元素大,谁的字典序比较大,比如数组a=[1,2,3]与数组b=[1,3,2]比较:a[0]=b[0],a[1]<b[1],此时出现了第一个不相同的,且a[1]<b[1],则a的字典序小于b的字典序。且[1,3,2]的字典序在排列S中,正好在[1,2,3]的后面,视为[1,3,2]的字典序比[1,2,3]的字典序大于1。
3.如果不存在更大的数组排列,则返回最小的数组排列。

数据范围:排列长度满足 ,排列中的值满足

示例1

输入:

[1,2,3]

输出:

[1,3,2]

示例2

输入:

[3,2,1]

输出:

[1,2,3]

说明:

[3,2,1]是当前最大的数组排列了,不存在比它更大的了,故返回最小的数组排列

示例3

输入:

[2]

输出:

[2]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 392KB, 提交时间: 2022-01-22

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& nums) {
        // write code here
        next_permutation(nums.begin(), nums.end());
        return nums;
        
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2021-12-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& nums) {
        // write code here
        int i = nums.size()-1;
        vector<int> tmp;
        for(i; i>=0;i--){
            if(i == 0) break;
            else if(nums[i] > nums[i-1]){
                int t = nums[i];
                nums[i] = nums[i-1];
                nums[i-1] = t;
                break;
            }
            tmp.push_back(nums[i]);
        }
        if(i == 0){
            tmp.push_back(nums[0]);
            return tmp;
        }
        vector<int> res;
        for(int j = 0; j<=i;j++){
            res.push_back(nums[j]);
        }
        for(int j = 0; j < tmp.size();j++){
            res.push_back(tmp[j]);
        }
        return res;
        
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-07-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& nums) {
        // write code here
         if(nums.size()==1)return nums;
        int pos=nums.size()-2;
        for(;pos>=-1;pos--){
            if(pos==-1)break;
            if(nums[pos]<nums[pos+1])break;
        }
        if(pos==-1){
            sort(nums.begin(),nums.end());
            return nums;
        }
        else{
            int base=nums[pos];
            int diff=INT_MAX;
            int greatlit=pos;
            for(int i=pos+1;i<nums.size();i++){
                int diffins=nums[i]-base;
                if(diffins>0&&diffins<diff){
                    greatlit=i;
                    diff=diffins;
                }
            }
            swap(nums[pos],nums[greatlit]);
            sort(nums.begin()+pos+1,nums.end());
            return nums;
        }
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-02-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& nums) {
        // write code here
        int len=nums.size();
        if(len==1)
            return nums;
        if(len==2){
            swap(nums[0], nums[1]);
            return nums;
        }
        int i=len-1;
        while(i>0 && nums[i]<=nums[i-1])
            --i;
        if(i==len-1){
            swap(nums[len-1], nums[len-2]);
            return nums;
        }
        if(i==0){
            sort(nums.begin(), nums.end());
            return nums;
        }
        int idx=i-1;
        i=len-1;
        int swapIdx=-1;
        while(i>idx){
            if(nums[i]>nums[idx]){
                if(swapIdx==-1 || nums[i]<nums[swapIdx])
                    swapIdx=i;
            }
            --i;
        }
        swap(nums[idx], nums[swapIdx]);
        sort(nums.begin()+idx+1, nums.end());
        return nums;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-05-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& nums) {
        // write code here
        int i=nums.size()-2;
        while(i>=0&&nums[i]>nums[i+1])
        {
            i--;
        }
        if(i>0)
        {
            int j=nums.size()-1;
            while(j>=i+1&&nums[j]<nums[i])
            {
                j--;
            }
            swap(nums[i],nums[j]);
        }
        sort(nums.begin()+i+1,nums.end());
        return nums;
    }
};

上一题