• leetcode31


    class Solution {
    public:
        void nextPermutation(vector<int>&nums) {
            int len = nums.size();
            int k = -1, l = 0, i = 0;//注意三个变量的初始化值
     
            for (i = len - 2/*即倒数第二个元素(逆序遍历)*/;i >= 0;--i)
                if (nums[i + 1] > nums[i]) {
                    k = i;
                    break;//因为是逆序,故此时得到的k一定是最大的
                }
     
            if (k == -1) {
                reverse(nums.begin(), nums.end());//此时代表原数组为逆序排列,故直接反转
                return;
            }
     
            //接下来找i
            for (i = len - 1;i >= 0;--i) {
                if (nums[i] > nums[k]) {
                    l = i;
                    break;
                }
            }
     
            //二者交换
            swap(nums[k], nums[l]);
     
            //再反转k之后的元素(不包括nums[k])
            reverse(nums.begin() + k + 1, nums.end());
        }
    };

    补充一个非常复杂,不美观的版本,使用python实现,也可以AC,能写出来我也挺佩服自己的。

    这个版本的主要思想就是从后向前找,记录已查找范围的最大值,当查找到一个值a比已查找区域的最大值maxnum要小的时候,就可以进行换位操作了。

    但是要确定一个在已查找区域中比a值大的最小的那个值来进行交换。所以这段代码写的不太美观,如果有高级一点的api可能更美观一些吧。

     1 class Solution:    
     2     def nextPermutation(self, nums: 'List[int]') -> 'None':
     3         for i in range(len(nums)-1,-1,-1):
     4             basenum = nums[i]
     5             maxnum = basenum
     6             for j in range(i-1,-1,-1):
     7                 curnum = nums[j]
     8                 maxnum = max(maxnum,curnum)
     9                 if curnum < maxnum:
    10                     for x in sorted(nums[j:]):
    11                         if x > curnum:
    12                             z = j - 1
    13                             for y in nums[j:]:
    14                                 z += 1
    15                                 if x == y:
    16                                     slices1 = nums[j:z]
    17                                     slices2 = nums[z+1:]
    18                                     slices1.extend(slices2)
    19                                     nums[j] = nums[z]
    20                                     nums[j+1:]=sorted(slices1)
    21                                     return
    22 
    23                     
    24         nums.sort()
  • 相关阅读:
    UVA 1600
    P3366 【模板】最小生成树(堆优化prim)
    P2414 [NOI2011]阿狸的打字机
    P2322 [HNOI2006]最短母串问题
    P4052 [JSOI2007]文本生成器
    P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
    P3966 [TJOI2013]单词
    P2444 [POI2000]病毒
    P3294 [SCOI2016]背单词
    P2922 [USACO08DEC]秘密消息Secret Message
  • 原文地址:https://www.cnblogs.com/asenyang/p/9837080.html
Copyright © 2020-2023  润新知