LeetCode-60题:排列序列解法二(原创)

【题目描述】

      给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:"123" 、"132" 、"213" 、"231"、"312"、"321"。给定 n 和 k,返回第 k 个排列。

示例 1:
    输入:n = 3, k = 3
    输出:"213"

示例 2:
    输入:n = 4, k = 9
    输出:"2314"
    示例 3:

    输入:n = 3, k = 1
    输出:"123"

提示:
    1)1 <= n <= 9
    2)1 <= k <= n!

【题目链接】. - 力扣(LeetCode)

【解题代码】

package number;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;

public class GetPermutation {

    public static void main(String[] args) {
        //int n = 4, k = 9;
        int n = 4, k = 3;
        System.out.println("计算结果:" + new GetPermutation().getPermutation(n, k));
    }

    public String getPermutation(int n, int k) {
        // 生成1到n的数组
        int[] nums = IntStream.range(1, n + 1).toArray();
        // 运行K次获取下一个数字排列组合
        for (int i = 0; i < k - 1; i++) {
            nextPermutation(nums);
        }
        // 最后将生成的整数数组结果转换成字符串
        return Arrays.stream(nums).mapToObj(String::valueOf).reduce((a, b) -> a + b).get();
    }

    private void nextPermutation(int[] nums) {
        // 从倒数第二个数开始,尝试能够递增替换此数字,依次向前推进
        int i = nums.length - 2;
        Lable:
        for (; i >= 0; i--) {
            // 往后找比当前数大的数,将两个数交换,然后跳出整个循环
            for (int j = nums.length - 1; j > i; j--) {
                if (nums[i] < nums[j]) {
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                    break Lable;
                }
            }
        }
        // 后面的数字,从小到大排序即可
        Arrays.sort(nums, i + 1, nums.length);
    }

}

【解题思路】

        之前此题已经在博文LeetCode-60题:排列序列解法一(原创)-CSDN博客中介绍了一种解法,虽然提交成功,但运行时长400多毫秒,而且递归实现有些晦涩,还有没有其它更加巧妙的方法呢,本人苦苦思索,拿着数字排列“3124,3142,3214,3241,3412。。。“翻来覆去的去找其中的规律,突然间真是灵光一闪,发现如下真理:每个数字排列的下一个排列:就是从倒数第二个数字开始,往后找到比此数大的数字,两者进行交换,然后再将后面的数字进行排序即可,找不到的话向前推进。。。发现这么大的天机,当下真是兴奋不已,立马修改好代码,运行提交LeetCode成功!

【解题步骤】

  1. 定义一个递归回溯函数,获取输入的数字集合下一个排列
    private void nextPermutation(int[] nums) {。。。}
  2. 主函数里,先初始化数字集合为最小排列序列,然后对此数字集合取k-1次下一个排列,然后返回结果即可
    // 生成1到n的数组
    int[] nums = IntStream.range(1, n + 1).toArray();
    // 运行K次获取下一个数字排列组合
    for (int i = 0; i < k - 1; i++) {
        nextPermutation(nums);
    }
    // 最后将生成的整数数组结果转换成字符串
    return Arrays.stream(nums).mapToObj(String::valueOf).reduce((a, b) -> a + b).get();
  3. nextPermutation函数里i从倒数第二个数开始,尝试能够递增替换此数字,依次向前推进,往后找比当前数大的数,将两个数交换,然后跳出整个循环
    // 已经访问到数字集合尾部,当前排列完成生成, 序列号加1并返回
    if (n == nums.length) {
        return m + 1;
    }
  4. 然后将后面的数字,从小到大排序即可
    Arrays.sort(nums, i + 1, nums.length);

【思考总结】

  1. 算法实现精要:每个数字排列的下一个排列:就是从倒数第二个数字开始,往后找到比此数大的数字,两者进行交换,然后再将后面的数字进行排序即可,找不到的话向前推进。。。;
  2. 算法实现最好能精益求精,不可浅尝辄止,温故而知新比做新的算法题可能收获更大;
  3. 一定要有自己的原创算法思想,不能一味按照公式去套,那样的话就只是机械的应试刷题,没有自己的灵魂!没有自己的思想!
  4. LeetCode解题之前,一定不要看题解,看了就“破功”了!      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第八篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读使用Python库清洗处理从PDF文件提取的文本

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python清洗处理文本的常见步骤二、使用Python库去除非文本元素示例代码三、使用Python库去除格式化元素的示例代码四、使用Python库去除空白字符示例代码五、使用Python库合并段落和行示…

在任何 Mac 上恢复永久删除照片的 5 种简单方法

Mac 为业余和专业摄影师提供了很多东西&#xff0c;从令人印象深刻的硬件到广泛的照片管理和编辑应用程序。它还提供了多种恢复丢失照片的方法&#xff0c;我们在本文中介绍了其中的五种方法&#xff0c;以帮助您避免潜在的灾难性情况。 Mac 上删除的照片去了哪里&#xff1f;…

高能脉冲电阻-高能陶瓷电阻

EAK无感实芯电阻器&#xff0c;高能电阻&#xff0c;高能脉冲电阻&#xff0c;高能陶瓷电阻 产品特性&#xff1a; Ⅰ100%陶瓷实芯压铸结构,由粘土、二氧华硅、瓷粉等无机材料经高温烧结而成。 Ⅱ承受高脉冲能量 ,适应高压,超高压环境,能用于1000KV以上电路瞬间功率达到3KKW以…

【阅读笔记】Kinematic On‐the‐Fly GPS Positioning Relative to a Moving Reference

Hermann B R, Evans A G, Law C S, et al. Kinematic On‐the‐Fly GPS Positioning Relative to a Moving Reference[J]. Navigation, 1995, 42(3): 487-501. 单词解释 Antenna swap&#xff1a;天线交换 pseudokinematic&#xff1a;伪运动学 ambiguity&#xff1a;双关、歧…

Web框架开发-django模型层(多表操作)

一、创建模型 实例: 作者模型:一个作者有姓名和年龄 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email。 书籍模型: 书籍有书名和出版…

Python面向对象三大特征(封装、继承、多态)

面向对象编程的三大特征&#xff1a;封装、继承和多态。 注意&#xff1a;在python面向对象编程中&#xff0c;子类对象可以传递给父类类型 一、封装 在Python中&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它可以帮助我们实现数据隐藏、信息保护和代码复用。…

使用jscpd对比重复代码

背景 检查项目中重复的代码&#xff0c;或者代码片段 jscpd 两个文件对比 Jscpd 是一个用于检测代码复制和粘贴的工具&#xff0c;它可以比较两个文件并报告相似性的百分比。 以下是如何使用 Jscpd 来比较两个文件的示例&#xff1a; 首先&#xff0c;确保你已经安装了 Nod…

【Flutter学习笔记】9.7 动画过渡组件

参考资料&#xff1a;《Flutter实战第二版》9.7 动画过渡组件 “动画过渡组件”指的是在Widget属性发生变化时会执行过渡动画的组件&#xff0c;其最明显的一个特征就是会在内部管理一个AnimationController。controller定义了过渡动画的时长&#xff0c;而animation对象的定义…

Linux学习之C/C++文件操作底层调用及原理

前言&#xff1a;我们都知道&#xff0c;我们学习的C/C是无法直接与底层硬件进行交互的&#xff0c;所有需要与底层硬件的交互都是通过操作系统作为中介完成的&#xff0c;那Linux到底是怎么做到的呢&#xff1f;接下来我们将揭开它神秘的面纱。 目录 一&#xff0c;操作系统…

全平台7合一万能DIY小程序源码系统 带完整的安装代码包以及安装搭建教程

在当下的小程序市场中&#xff0c;虽然已有众多开发工具和服务平台&#xff0c;但很多用户仍然面临着开发难度大、功能不齐全、定制性差等问题。小编给大家分享一款全平台7合一万能DIY小程序源码系统。该系统旨在解决用户在小程序开发过程中的痛点&#xff0c;提供一站式的小程…

WordPress Plugin NotificationX插件 SQL注入漏洞复现(CVE-2024-1698)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。 0x02 漏洞概述 WordPress plugin NotificationX是一个应用插件。2.8.2版本及之前 存在安全漏洞,该…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…

Hyper Casual FX

此包包含&#xff1a; 五彩纸屑-2种 灰尘 - 1 种 闪光灯 - 8 种类型 闪耀 - 3 种类型 闪亮 - 1 种 水-2种 它可以在没有任何设置的情况下开箱即用 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

C语言编程实现文件加解密

目录 1. OpenSSL导入程序项目2. 编写加解密程序1. 程序代码2. 命令行传参3. 文件的读写4. 加解密中的细节 1. OpenSSL导入程序项目 下载并安装OpenSSL&#xff0c;下载地址打开VS&#xff0c;创建控制台应用 记得配置文件位置 右键项目名称&#xff0c;找到属性&#xff0c;并…

MySQL面试复习记录

一、mysql文章地址汇总 以下均为蓝云飘飘的文章&#xff1a; MySQL数据库&#xff08;一&#xff09;_写出sql语句,列出薪资比‘王海涛’的薪资高的所有员工,显示姓名,薪资-CSDN博客 MySQL数据库&#xff08;二&#xff09;_sql里的性别是什么代表-CSDN博客 ★★★★★ My…

(基础)AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信&#xff0c;它可以使用JSON、XML、HTML和text文本等格式发送和接收数据&#xff0c;AJAX最吸引人的就是它的异步特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#xff0c;…

Effect:由渲染本身引起的副作用

React 组件中的两种逻辑类型&#xff1a; 渲染逻辑代码 位于组件的顶层&#xff0c;接收 props 和 state&#xff0c;进行转换&#xff0c;返回屏幕上看到的 JSX&#xff0c;只计算不做其他任何事情&#xff1b;事件处理程序 嵌套在组件内部的函数&#xff0c;由特定的用户操作…

【timm笔记1】

1. 安装timm pip install timm2. 打印模型 import timm# 获取并打印所有可用的预训练模型名称 available_models = timm.list_models() # 打印出所有的模型 print(available_models)# 打印所有包含"resnet"字符的模型名称 resnet_models = timm.list_models(*resne…

2024年03月 Discourse 3.3.0.beta1 版本的更新

在这个版本的更新中 Discourse 完成了 Ember 5 版本的升级和更新。 Ember.js是一个用于创建 web 应用的 开源JavaScript MVC 框架&#xff0c;采用基于字符串的Handlebars 模板&#xff0c;支持双向绑定、观察者模式、计算属性&#xff08;依赖其他属性动态变化&#xff09;、…

Oracle数据库冷备份(实例)

冷备份 1、 select file#,name,bytes/1024/1024 mb from v$datafile; 2 、缩减 便于copy alter database datafile 2 resize 100m;show parameter spfilecreate undo tablespace u2 datafile /u01oracle/oradata/qq/u2.dbf size 2m autoextend on; //建新的 alter system…