31. 下一个排列(Swift版)

一、题目

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

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

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

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

二、解题

这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况,可以参见之前的博客 Permutations 全排列。我们再来看下面一个例子,有如下的一个数组
1  2  7  4  3  1
下一个排列为:
1  3  1  2  4  7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1  2  7  4  3  1
1  2  7  4  3  1
1  3  7  4  2  1
1  3  1  2  4  7

三、代码实现

    class Solution {
        func nextPermutation(_ nums: inout [Int]) {
            var j = nums.count
            for i in stride(from: nums.count-2, through: 0, by: -1) {
                if nums[i+1] > nums[i] {
                    for k in stride(from: nums.count-1, to: i, by: -1) {
                        j = k
                        if nums[k] > nums[i] {
                            break
                        }
                    }
                    nums.swapAt(i, j)
                    nums[i+1..<nums.count].sort()
                    return
                }
            }
            nums.sort()
        }
    }

Demo地址:github

    原文作者:ma772528138
    原文地址: https://www.jianshu.com/p/44ca662feeb6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞