题意

给一串数字,找到字典序中刚好比这一串数字大的一种新排列

思路

从后向前找,找到第一个后一位比前一位大的地方,然后把这个位置标为x,则找到x——num.end()中比nums[x-1]要大,并且最小的数字,与nums[x-1]交换,然后再把nums[x ~ nums.end()]排序即可。
时间复杂度:O(nlogn)

代码

class Solution {
public:
    int findmin(vector<int>& arr, int left)
    {
        int tmp = INT_MAX, idx = -1, bound = arr[left-1];
        for (int i = left; i < arr.size(); i++)
        {
            if (arr[i] > bound && arr[i] < tmp)
            {
                idx = i;
                tmp = arr[i];
            }
        }
        return idx;
    }
    void nextPermutation(vector<int>& nums) {
        for (int i = nums.size() - 1; i >= 1; i--)
        {
            if (nums[i] > nums[i-1])
            {
                int idx = findmin(nums, i);
                swap(nums[i-1], nums[idx]);
                sort(nums.begin()+i, nums.end());
                return ;
            }
        }
        sort(nums.begin(), nums.end());
    }
};

31. Next Permutation

相关文章:

  • 2021-04-08
  • 2021-06-21
  • 2021-08-11
猜你喜欢
  • 2022-02-21
  • 2022-01-25
相关资源
相似解决方案