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--
            }
        }
    }
  • 相关阅读:
    20155328 《网络攻防》 实验一:PC平台逆向破解(5)M
    20155328 《信息安全系统设计基础》 课程总结
    构建之法
    20155327 2017-2018-2《Java程序设计》课程总结
    20155327 实验五 网络编程与安全
    20155327 网络对抗 实验
    20155327 Exp9 Web安全基础
    20155327 EXP8 Web基础
    20155327 实验四 Android程序设计
    20155327 李百乾 Exp7 网络欺诈防范
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13204059.html
Copyright © 2011-2022 走看看