31 Next Permutation

将一组数打乱顺序,所有不同顺序的排列的集合。对于一个任意序列,最小的排列是增序,最大的排列是减序。最小的排列起始数目最小,最大的排列起始数目最大。要找下一个大的全排列,就是找最大的降序的。

  • Runtime: 88 ms, faster than 70.72%
  • Memory Usage: 37.4 MB, less than 61.81%

对当前排列从后向前扫描,找到一对为升序的,记录为i和j (i > j)。如果不存在这样一对为升序的相邻元素,所有排列已找到,算法结束。否则,重新对当前排列从后向前扫描,找到第一个大于j的元素k,交换j 和k,然后对从j开始到结束的子序列反转,此时得到的新排列就是写一个字典序排列。这种方式实现得到的所有排列是按字典序有序的,这也是C++STL 算法next_permutation的思想。

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var nextPermutation = function(nums) {
    let len = nums.length
    var j
    for(var i = len - 1; i > 0; i--) {
        if(nums[i - 1] < nums[i]) {
            j = i - 1
            break
        }
    }
    if(j === undefined) return nums.reverse()
    for(var k = len - 1; k > j; k--){
        if(nums[k] > nums[j]) {
            swap(nums, k, j)
            break
        }
    }
    let s = nums.slice(i).reverse()
    nums.splice(i, len - 1, ...s)
    return nums
};

var swap = function (nums, m, n) {
    let temp = nums[m]
    nums[m] = nums[n]
    nums[n] = temp
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    AIM外星人阅读 1,315评论 0 1
  • 题目实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排...
    HITZGD阅读 435评论 0 0
  • Description: Implement next permutation, which rearranges...
    CharlieGuo阅读 461评论 0 0
  • 每次的学习会或者是空巴,总觉得学委忙前忙后,不知惫倦。说句老实话心里很是羡慕和感恩,羡慕的是学委每次的真诚;...
    刘伟师阅读 649评论 0 0

友情链接更多精彩内容