zoukankan      html  css  js  c++  java
  • 31. Next Permutation

    package LeetCode_31
    
    /**
     * 31. Next Permutation
     * https://leetcode.com/problems/next-permutation/description/
     *
    Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
    If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
    The replacement must be in-place and use only constant extra memory.
    Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1
     * */
    class Solution {
        /*
        Time complexity:O(n^2), Space complexity:O(1)
        * Approach
        ==Find the first decreasing index moving from end to start
            E.g. [7, 2, 3, 1, 5, 4, 3, 2, 0] num 1 is the first decreasing index going from the end backwards
        ==Swap num 1 with the next large num to its right which is 2
            [7, 2, 3, 2, 5, 4, 3, 1, 0]
        ==Reverse/sort nums to the right
            [7, 2, 3, 2, 0, 1, 3, 4, 5]
        ==If there is no next permutation return a sorted array
        * */
        fun nextPermutation(nums: IntArray): Unit {
            for (i in nums.size - 2 downTo 0) {
                if (nums[i] < nums[i + 1]) {
                    val large = nextLargeIndex(nums, i)
                    swap(nums, i, large)
                    reverse(i+1,nums)
                    return
                }
            }
            nums.sort()
        }
    
        private fun swap(nums: IntArray, i: Int, j: Int) {
            val temp = nums[i]
            nums[i] = nums[j]
            nums[j] = temp
        }
    
        private fun nextLargeIndex(nums: IntArray, index: Int): Int {
            for (i in nums.size - 1 downTo index) {
                if (nums[i] > nums[index]) {
                    return i
                }
            }
            return 0
        }
    
        private fun reverse(index: Int, nums: IntArray) {
            var i = index
            var j = nums.size - 1
            while (i <= j) {
                swap(nums, i, j)
                i++
                j--
            }
        }
    }
  • 相关阅读:
    vue 动态生成 el-checkbox-group,动态绑定v-model的解决方法
    vue 弹窗内scrollTop取值为0的问题
    软件工程课程学习心得
    《软件工程》学习总结及获奖感言
    软件工程课程心得及小黄衫获奖感想
    Prometheus + Alertmanager 实现企业微信告警
    二进制安装Prometheus
    zabbix机器人告警配置流程
    c++不同平台崩溃解析总结
    c++跨平台开发技术总结
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13204059.html
Copyright © 2011-2022 走看看