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解题之前,一定不要看题解,看了就“破功”了!      

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化转型:传统行业的新出路?

近年来&#xff0c;数字化转型已成为各行各业的热议话题。许多传统行业正面临着巨大的挑战&#xff0c;例如市场竞争加剧、成本上升、利润率下降等。数字化转型被视为传统行业破局的关键。那么&#xff0c;数字化转型究竟是不是传统行业的新出路呢&#xff1f; 传统行业面临的挑…

Qt 坐标位置转换

Qt 坐标位置转换 文章目录 Qt 坐标位置转换常见的位置坐标转换Qt窗体中常用坐标的区别与获取途径当前光标相对于屏幕的绝对位置当前光标相对于当前窗口的位置鼠标事件发生的位置窗体的位置判断鼠标光标是否悬浮在某个子控件上 从事Qt快一年了 &#xff0c;在做坐标转换的时候容…

OpenCV4.9.0在Android 开发简介

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用 Clojure 进行 OpenCV 开发简介 下一篇&#xff1a;暂无 引言&#xff1a; OpenCV是一个跨平台计算机视觉库&#xff0c;广泛用于图像处理、计算机视觉和机器学习等领域…

python网络爬虫实战教学——urllib的使用(3)

文章目录 专栏导读1、urlsplit2、urlunsplit3、urljoin4、urlencode 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、…

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的…

群发短信后的实际效果统计分析

群发短信后的实际效果统计分析是评估短信营销效果的关键环节&#xff0c;有助于企业了解短信发送的效果&#xff0c;并据此优化营销策略。以下是对群发短信实际效果统计分析的详细探讨&#xff1a; 首先&#xff0c;企业需要关注短信的发送成功率。这包括短信是否成功发送至目标…

TinTin Web3 Bounty 挑战杯开启,Sui 向你发出挑战邀请!

2024 年开年最火的是什么&#xff1f; 对 Web3 来说&#xff0c;Bounty 任务应该是普通人获得行业“一杯羹”的重要捷径&#xff01; 通过深入学习各类 Web3 技术&#xff0c;凭借实战锻炼开发创新项目&#xff0c;就有机会获得各大生态项目方的 Bounty 奖励。 TinTinLand 社…

TSINGSEE青犀数字化、智能化视频技术推动森林防火智慧监管

一、背景分析 中央网络安全和信息化委员会印发《“十四五”国家信息化规划》&#xff0c;明确指出“提升林草生态网络感知能力&#xff0c;完善生态系统保护成效数字化监测评估体系”。这为数字化系统建设引领了方向&#xff0c;中国林业信息化建设迈入了新的阶段&#xff0c;全…

HTML5语法总结

文章目录 一.HTML基本框架二.标题标签三.段落标签四.换行与水平线标签五.文本格式化标签(加粗、倾斜、下划线、删除线)六.图像标签扩展&#xff1a;相对路径,绝对路径与在线网址 七.超链接标签八.音频标签九.视频标签十.列表标签十一.表格标签扩展&#xff1a;表格结构标签合并…

[C/C++] -- 链表

C/C 中链表是一种常见的数据结构&#xff0c;用于存储和组织数据。链表由节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含数据和指向下一个节点的指针。链表相对于数组的优势在于可以动态地分配内存&#xff0c;插入和删除操作效率高&#xff0c;但访问元素的随…

MacOS 电脑如何通过自带terminal终端连接PostgreSQL

1、安装Postgre SQL客户端工具 brew install postgresql 2、连接到PostgreSQL &#xff08;1&#xff09;创建远程连接 psql -h hostname -U username -d database 其中&#xff0c;hostname 是 PostgreSQL 服务器的主机名或 IP 地址&#xff0c;username 是您的 PostgreS…

机器学习 - 预测训练模型

接着上篇博客机器学习-训练模型做进一步说明。 There are three things to make predictions (also called performing inference) with a PyTorch model: Set the model in evaluation mode (model.eval())Make the predictions using the inference mode context manager (…

学点Java_Day6_基于Copyright和Actions On Save的IDEA自动更新文件最后编辑时间的方法研究(IDEA2021.2及以上)

0 版本要求 IDEA2021.2及以上&#xff0c;我用的IntelliJ IDEA 2023.2.4 1 操作 1.1 Copyright设置 ① CtrlAltS打开设置&#xff08;Settings&#xff09;→ Editor → Copyright   ② Copyright → Copyright Profiles → → 取名 → OK   ③ 复制下面内容到框里&am…

java多线程使用与踩坑

SpringBoot使用多线程简单方法&#xff1a;地址 线程安全查阅资料参考&#xff1a;地址 背景&#xff1a; 经过上述资料查看&#xff0c;我想写个方法&#xff08;依靠notify()唤醒&#xff0c;依靠wait()等待&#xff09;实现两个线程轮流打印。 实现&#xff1a; 1.线程池配…

[Qt学习笔记]Qt使用MFC编译生成dll库在无编程环境电脑出现无法加载dll的问题

目录 1、 问题介绍2、 问题分析3、 问题总结和思考 1、 问题介绍 在项目实践中&#xff0c;使用Qt调用了一个vs创建的dll库&#xff0c;在本机上编译和release后的exe可以加载对应的dll文件&#xff0c;将exe拷贝到有vs编程环境的电脑上也可以加载对应的dll文件&#xff0c;但…

Centos7部署单节点MongoDB(V4.2.25)

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

Java面试题(Spring篇)

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 Java面试题(Spring篇) 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主页…

[STM32] Keil MDK 新建工程编译不通过(warning: #2803-D和Error: L6218E)解决方法备忘

按照野火的PDF教程的第4章&#xff1a;[野火]《RT-Thread 内核实现与应用开发实战—基于STM32》.pdf 新建 Keil MDK 工程&#xff0c;工程设置完成后点击编译按钮&#xff0c;编译不通过&#xff1a; RTE\Device\ARMCM3\startup_ARMCM3.c(75): warning: #2803-D: unrecognize…

如何准备2024年汉字小达人:历年考题练一练-18道选择题解析

距离2024年第11届汉字小达人比赛还有七个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#xff0c…

Mybatis之自定义映射resultMap

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…