zoukankan      html  css  js  c++  java
  • Leetcode | Next Permutation

    Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

    If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

    The replacement must be in-place, do not allocate extra memory.

    Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1

    分析了一下,得出有以下规律,accepted。大体思路和网上一样。红色部分是网上的解法。

    1. 从右往左扫,找到第一个不符合num[i]>=num[i+1]的数;

    2. 然后从[i+1...n-1]中找到比num[i]大的最小数num[j];这里我直接找大于num[i]的最小值了;其实因为[i+1..n-1]是递减的,可以从右往左扫,找到第一个数就退出就行了。

    3. 交换num[j]和num[i];交换之后,仍然会保证[i+1...n-1]是递减的。

    4. 对[i+1...n-1]进行排序;因为[i+1...n-1]是递减的,直接reverse就可以了,不需要排序。 

    5. 如果找到的数i<0,也就是整个序列都是递减的,那么直接排序就行;同样可以用reverse

     1 class Solution {
     2 public:
     3     void nextPermutation(vector<int> &num) {
     4         int i;
     5         for (i = num.size() - 2; i >= 0; --i) {
     6             if (num[i] >= num[i + 1]) continue;
     7             int minIndex = i + 1;
     8             for (int j = i + 1; j < num.size(); ++j) {
     9                 if (num[j] > num[i] && num[j] < num[minIndex]) minIndex = j;
    10             }
    11             swap(num[i], num[minIndex]);
    12             sort(num.begin() + i + 1, num.end());
    13             break;
    14         }
    15         if (i < 0) sort(num.begin(), num.end());
    16     }
    17 };

    不过因为可以不用写reverse的代码,直接用sort看起来简洁得多。重构了一下代码就是:

     1 class Solution {
     2 public:
     3     void nextPermutation(vector<int> &num) {
     4         int i, j;
     5         for (i = num.size() - 2; i >= 0 && num[i] >= num[i + 1]; --i); 
     6         if (i >= 0) {
     7             for (j = num.size() - 1; j > i && num[j] <= num[i]; --j); 
     8             swap(num[i], num[j]);
     9         } 
    10         sort(num.begin() + i + 1, num.end());
    11     }
    12 };
  • 相关阅读:
    bzoj 3744: Gty的妹子序列 主席树+分块
    bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
    bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
    约瑟夫问题例题小结
    bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化
    人生第一场CTF的解题报告(部分)
    ZOJ 3811 Untrusted Patrol【并查集】
    POJ 2112: Optimal Milking【二分,网络流】
    Codeforces Round #277 (Div. 2 Only)
    POJ 2195 Going Home【最小费用流 二分图最优匹配】
  • 原文地址:https://www.cnblogs.com/linyx/p/3734451.html
Copyright © 2011-2022 走看看