leetcode31.下一个排列

image.png

返回数组的下一个字典序,解决思路:
从后往前找,找到一个a[i - 1],使得a[i - 1] < a[i],然后从a[i]向后找,找到一个最接近a[i - 1]且大于a[i - 1]的数a[j],交换a[i - 1]和a[j],此时a[i - 1]后面的序列还是递减的,将a[i - 1]后面的序列翻转,即是我们想要的结果。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i = nums.size() - 2;
        while (i >= 0 && nums[i] >= nums[i + 1]) {
            i--;
        }
        if (i >= 0) {
            int j = nums.size() - 1;
            while (j >= 0 && nums[i] >= nums[j]) {
                j--;
            }
            swap(nums[i], nums[j]);
        }
        reverse(nums.begin() + (i + 1), nums.end());
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • lexicographically / 字典序 / 全排列: 所以题目的意思是,从上面的某一行排到下一行,如果已经...
    冰源阅读 2,096评论 1 0
  • 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,...
    LHH大翰仔仔阅读 232评论 0 0
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,738评论 0 89
  • 1、常用排序算法 2、快速排序法 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比...
    Bling_ll阅读 563评论 0 0
  • 对于大学毕业的年轻人来说,面对大城市的繁华与小县城的安逸,应该怎样取舍,虽是老生常谈,但它在日新月异的今天又被赋予...
    成长时刻jiayou阅读 520评论 0 4