美文网首页LeetCode题库-Swift解题
31. 下一个排列(Swift版)

31. 下一个排列(Swift版)

作者: Mage | 来源:发表于2019-01-29 17:32 被阅读3次

    一、题目

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

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

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

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
    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

    相关文章

      网友评论

        本文标题:31. 下一个排列(Swift版)

        本文链接:https://www.haomeiwen.com/subject/ndbjjqtx.html