zoukankan      html  css  js  c++  java
  • 031下一个排列

    自解法 20ms
    使用一遍法,从右向左依次比较相邻两个数字,看其是否为降序排列[降序排列无更大的排列了]
    当出现升序排列时,只需要将此处的数字与其右端比其大一点点的数进行交换,再将【i-1】右端的数进行升序排列
    就得到比目前大一点的排列了。如图所示

     1 class Solution {
     2 public:
     3     void nextPermutation(vector<int>& nums) {
     4         if (nums.size() == 0)return;
     5         int flag = 1;//用来标记原排列是否无再大的排列
     6         for (int i = nums.size() - 1; i > 0; --i) {//从右端开始比较
     7             if (nums[i - 1] < nums[i])//此处为升序排列        
     8                 for (int j = nums.size() - 1; j > i - 1; --j) //找到比[i-1]大一点点的数
     9                     if (nums[i - 1] < nums[j]) {
    10                         swap(nums[i-1],nums[j]);                        
    11                         flag = 0;//存在更大的排列
    12                         sort(nums.begin()+i, nums.end()); //再将【i - 1】右端的数进行升序排列
    13                         return;
    14                     }
    15         }
    16         if (flag)//无再大的排列了,那么就返回最小排列
    17             sort(nums.begin(), nums.end());
    18         return;
    19     }
    20 };

    //使用C++的排列函数next_permutation  32ms

    1 class Solution {
    2 public:
    3     void nextPermutation(vector<int>& nums) {
    4         if (!(next_permutation(nums.begin(), nums.end())))//如果没有更大的排列了
    5             sort(nums.begin(), nums.end());//那就返回升序【最小排列】
    6     }
    7 };

    //博客代码
    //与自己的解法一样,只不过代码更简洁,时间一样,内存多了一点点

     1 class Solution {
     2 public:
     3     void nextPermutation(vector<int>& nums) {
     4         int n = nums.size(), i = n - 2, j = n - 1;
     5         while (i >= 0 && nums[i] >= nums[i + 1]) --i;
     6         if (i >= 0) {
     7             while (nums[j] <= nums[i]) --j;
     8             swap(nums[i], nums[j]);
     9         }
    10         reverse(nums.begin() + i + 1, nums.end());
    11     }
    12 };
  • 相关阅读:
    Roofline Model与深度学习模型的性能分析
    卷积神经网络的复杂度分析
    CNN中卷积层的计算细节
    ImageNet 历届冠军最新评析:哪个深度学习模型最适合你?
    最新ICE源码编译安装
    CNN 模型压缩与加速算法综述
    YAML 与 front-matter
    VMware 虚拟机快照、克隆、磁盘扩容
    ubuntu16.04安装Nvidia显卡驱动、CUDA8.0和cudNN V6
    宏使用 Tricks
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10542402.html
Copyright © 2011-2022 走看看