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

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

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

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

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

    分析:

      给出一个数组, 找出下一个排列, 下一个排列由相同的数字组成, 且比当前顺序组成的数字大, 且最接近的

    思路:

      从末端开始找第一个降序的数,其位置记为i-1

      从i到数组末端, 找到比i-1的值大, 且值和i-1的值相差最小的数的位置, 记为index

           把i-1和index位置上的值交换

      对i-1之后的值进行排序

     1 void nextPermutation(vector<int>& nums) {
     2         int i, len = nums.size();
     3         int min = 99999999, index = len-1;
     4         //找到第一个降序的位置
     5         for(i = len - 1; i > 0; i--) if(nums[i] > nums[i-1]) break;
     6         //如果i=0 则表示该数组是一个降序的数组
     7         if(i > 0) {
     8         for(int j = i; j < len; j++) {
     9             if(nums[j] > nums[i-1] && nums[j] - nums[i-1] < min) {
    10                 index = j;
    11                 min = nums[j] - nums[i-1];
    12             }
    13         }
    14         swap(nums[index], nums[i-1]);
    15         }
    16         sort(nums.begin()+i, nums.end());
    17         for(i = 0; i < len; i++) {
    18             if(i == 0) cout<<nums[i];
    19             else cout<<","<<nums[i];
    20         }
    21     }

    写代码的时候,还是有些不严谨,继续努力

    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    Memoization-329. Longest Increasing Path in a Matrix
    Map-560. Subarray Sum Equals K
    Geometry-587. Erect the Fence
    Reservoir Sampling-382. Linked List Random Node
    Brainteaser-292. Nim Game
    Minimax-486. Predict the Winner
    Topological Sor-207. Course Schedule
    web前端开发规范手册
    css初始化
    asp.net LINQ实现数据分页
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8877664.html
Copyright © 2011-2022 走看看