zoukankan      html  css  js  c++  java
  • LeetCode 31. 下一个排列(Next Permutation)

    题目描述

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

    必须原地修改,只允许使用额外常数空间。

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
    1,2,31,3,2
    3,2,11,2,3
    1,1,51,5,1

    解题思路

    由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例寻找下一个排列的步骤是:

    • 首先找到从后往前第一个升序数对,在此例中即(1,3)
    • 然后在升序对前一个数后面的数组中,从后往前找到第一个比升序对前一个数大的数,并将其与升序对前一个数交换,在此例中即找到2比1大,所以将2与1交换得到2,3,1
    • 最后将交换后的数组从升序对后一个数开始按升序排序,在此例中即从3开始按升序排序得到2,1,3

    在第一步中,若遍历到数组头部仍未找到升序对,说明不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

    代码

     1 class Solution {
     2 public:
     3     void nextPermutation(vector<int>& nums) {
     4         for(int i = nums.size() - 1; i >= 0; i--){
     5             if(i == 0)
     6                 sort(nums.begin(), nums.end());
     7             else if(nums[i] > nums[i - 1]){
     8                 int minIdx = nums.size() - 1;
     9                 while(nums[i - 1] >= nums[minIdx])
    10                     minIdx--;
    11                 swap(nums[minIdx], nums[i - 1]);
    12                 sort(nums.begin() + i, nums.end());
    13                 break;
    14             }
    15         }
    16     }
    17 };
  • 相关阅读:
    跨域请求页面跳转
    media query学习笔记
    JSONP跨域数据调用
    【转】轮询、长轮询、iframe长连接、web socket
    [转]node.js学习笔记(二)
    【转】require.js学习笔记(二)
    【转】require.js学习笔记(一)
    计算星期
    确定母亲节
    计算时钟的夹角
  • 原文地址:https://www.cnblogs.com/wmx24/p/9190853.html
Copyright © 2011-2022 走看看