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 };
  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10542402.html
Copyright © 2011-2022 走看看