zoukankan      html  css  js  c++  java
  • LeetCode图解 NextPermutation & Array类型问题

    1.问题描述

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

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

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

    2.测试用例

    示例 1:
    输入:nums = [1,2,3]
    输出:[1,3,2]

    示例 2:
    输入:nums = [3,2,1]
    输出:[1,2,3]

    示例 3:
    输入:nums = [1,1,5]
    输出:[1,5,1]

    示例 4:
    输入:nums = [1]
    输出:[1]

    3.提示
    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 100
    4.图解
    1. 暴力

      如果枚举每一种可能,再从所有的结果中查找下一个更大的排列,这个时间复杂度可能会达到 O(n!),直接忽略此思路

    2. 一遍循环

      根据需求可以拆解成三个步骤

    5.代码
    一遍循环
    public void nextPermutation(int[] nums) {
            int n = nums.length;
            if (n == 1) {
                return;
            }
            int k = n - 2;
            while (k >= 0 && nums[k] >= nums[k + 1]) {
                k--;
            }
            if (k == -1) {
                reverse(nums, 0, n - 1);
                return;
            }
            int i = k + 2;
            while (i <= n - 1 && nums[k] < nums[i]) {
                i++;
            }
            exchange(nums, k, i - 1);
            reverse(nums, k + 1, n - 1);
    }
    
    
    
    public void exchange(int[] nums, int start, int end) {
            int tmp = nums[start];
            nums[start] = nums[end];
            nums[end] = tmp;
    }
    
    
     public void reverse(int[] nums, int start, int end) {
            while (start < end) {
                exchange(nums, start, end);
                start++;
                end--;
            }
    }
    
  • 相关阅读:
    php yield学习笔记(一)
    EasySwoole的ContextManager的分析和使用
    Easyswoole的WaitGroup和Csp组件的分析和使用
    Laravel Event的分析和使用
    Laravel驱动管理类Manager的分析和使用
    Laravel Exception结合自定义Log服务的使用
    vue基础
    vue.js
    改善项目组织
    MongoDB 4.0版
  • 原文地址:https://www.cnblogs.com/worldline/p/15548875.html
Copyright © 2011-2022 走看看