Leetcode.60 排列序列

news2024/11/24 13:50:06

题目链接

Leetcode.60 排列序列

题目描述

给出集合 [1,2,3,...,n],其所有元素共有 n ! n! n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 n = 3 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 < = n < = 9 1 <= n <= 9 1<=n<=9
1 < = k < = n ! 1 <= k <= n! 1<=k<=n!

分析:
最容易想到的思路就是求出所有的排列,然后选取第 k 个排列返回即可,但是这个做法会超时,所以我们必须要剪枝
剪枝的思路:当我们每次选取一个数时,可以用未选的数的个数 的阶乘 c n t ! cnt! cnt! 和 k 做判断。

  • k < = c n t ! k <= cnt! k<=cnt! ,说明第 k 个排列就在这棵子树中,向下递归即可
  • k > c n t ! k > cnt! k>cnt! k − c n t ! k - cnt! kcnt!, 说明第 k 个排列不在这棵子树中,我们就剪掉这棵子树(不向下递归了),即剪枝。

图示说明:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)

C++代码:

class Solution {
public:
    int k,n;
    
    int fun(int x){
        int sum = 1;
        while(x){
            sum *= x;
            x--;
        }
        return sum;
    }
    void permution(int u,string& s,vector<bool> vis){
        if(u == n){
            return;
        }
        int cnt = fun(n-u-1);
        for(int i = 1;i <= n;i++){
            if(vis[i]) continue;
            if(cnt < k){
                k -= cnt;
                continue;
            }

            s += to_string(i);
            vis[i] = true;
            permution(u+1,s,vis);
            return;
        }
    }
    string getPermutation(int n, int k) {
        vector<bool> vis(n+1);
        this->k = k;
        this->n = n;
        string s = "";
        permution(0,s,vis);

        return s;
    }
};

Java代码:

class Solution {
    int n,k;
    
    //阶乘数组 f[i] = i!
    int[] f;
    void fun(){
        f[0] = 1;
        for(int i = 1;i <= n;i++){
            f[i] = i * f[i-1];
        }
    }
    
    void dfs(int u,StringBuilder sb,boolean[] vis){
        //当 u 等于 n时,说明已经找到了最终的第 k 个排列,直接返回即可
        if(u == n) return;
        //cnt 为剩下的没有被选的数 的个数的阶乘
        int cnt = f[n - u - 1];
        
        for(int i = 1;i <= n;i++){
            //如果之前已经选了 i 这个数,就跳过本次循环
            if(vis[i]) continue;
            //如果 cnt < k 说明第 k 个排列不在这棵子树上,跳过本次循环,剪枝
            if(cnt < k){
                 k -= cnt;
                 continue;
            }
            
            //由于我们要找的第 k 个排列是唯一的,所以不用回溯修改现场
            vis[i] = true;
            sb.append(i);
            dfs(u+1,sb,vis);
            //由于我们要找的路径只有一条,当回到本层循环的时候,说明已经找到了,此时再继续返回上一层就行
            return;
        }
    }
    public String getPermutation(int n, int k) {
        this.n = n;
        this.k = k;
        this.f = new int[n+1];
        fun();
        StringBuilder sb = new StringBuilder();
        boolean[] vis = new boolean[n+1];

        dfs(0,sb,vis);
        return sb.toString();
    }
}

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

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

相关文章

二、TTY子系统框架

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、TTY子系统框架分析2、TTY数据处理流程3、驱动的目录结构及核心文件4、TTY在Linux下的分布1、TTY子系…

微信小程序使用

微信开发介绍微信公众号的二次开发&#xff0c;主要点后端配置交互&#xff0c;前端负责h5页面微信小程序和微信小游戏的开发&#xff0c;必须要依托于微信&#xff0c;方便宣传开放平台&#xff0c;公众平台小程序介绍2016年出来的&#xff0c;取缔app应用。传统的App应用开发…

Vue中动态展示数据的字典项

问题描述 今天在写自己网站的时候&#xff0c;遇到一个问题&#xff0c;不知道各位前端初学者有没有遇到过这个问题 如图所示&#xff1a;我通过接口查询到一些信息&#xff0c;有两个属性是枚举数据(魔法值) 我们称这种数据为字典项&#xff0c;因为开发中一般称0&#xff…

AWS Markeplace 上的 DolphinDB MGR 快速上手

1. AWS 上的 DolphinDB MGR 简介 DolphinDB MGR 是部署于 Kubernetes 上的 DolphinDB 集群自动运维系统&#xff0c;提供包括部署、升级、扩缩容、配置变更的 DolphinDB 全生命周期管理。通过 DolphinDB MGR&#xff0c;DolphinDB 可以无缝运行在公有云或私有部署的 Kubernete…

openEuler RISC-V 的 Firefox 性能大升级,最高 40 倍性能提升

RISC-V SIG 择日即将发布 openEuler RISC-V 22.03 V2 版本镜像。本次发版会提供带有 SpiderMonkey JIT 编译支持的 Firefox 最新版本和带有 LLVMpipe 优化的 Mesa 最新版本安装源供使用者选装测试&#xff0c;预期图形界面使用性能会获得可观优化。 新版本的 Firefox 开启 JIT…

5.3、UDP 和 TCP 的对比

在使用 TCP/IP 体系结构的网络通信中&#xff0c;这两个协议的使用频率仅次于网际层的 IP 协议 TCP/IP 体系结构应用层中的某些协议需要使用运输层的 TCP 提供的服务 而另一些协议需要使用运输层的 UDP 提供的服务 1、UCP(无连接) & TCP(面向连接) 1.1、UDP 如下所示&am…

小程序:会议OA项目-其它页面

目录 一、tabs组件及会议管理布局 自定义tabs组件 跟着官网来感受一下 会议管理的布局 二、个人中心布局 一、tabs组件及会议管理布局 自定义tabs组件 文档参考:自定义组件 | 微信开放文档 跟着官网来感受一下 先建一个文件夹名为components&#xff0c;里面再建一个tabs的…

【C语言进阶(NEW)】六、文件操作(一)|文件|文件的打开和关闭|文件的顺序读写|文件读取结束的判定

目录 一、文件 1.1 什么是文件 1.1.1 程序文件 1.1.2 数据文件 1.2 为什么使用文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2 文件的打开和关闭 三、文件的顺序读写 3.1 fgetc 和 fputc&#xff08;字符输入输出函数&#xff09; 3.2 fgets 和 fputs&am…

20行原生JS代码手写ElementUI表格组件

又是许久没有写博客了&#xff0c;这几年的疫情&#xff0c;总是居家&#xff0c;时间久了&#xff0c;慢慢的总会想很多。现在越发觉得想做的事情一定要尽早去做&#xff0c;不然总说等下一次&#xff0c;很多时候&#xff0c;就没有下一次了。 今天给大家分享一下如何用原生…

从0到1完成一个Vue后台管理项目(十七、使用Echarts:柱状图、折线图)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

DB性能跟不上,加缓存就够了?

服务端软件开发时&#xff0c;通常会把数据存储在DB。而服务端系统遇到的第一个性能瓶颈&#xff0c;往往发生在访问DB时。 这时大部分开发会拿出“缓存”&#xff0c;通过使用Redis在DB前提供一层缓存数据&#xff0c;缓解DB压力&#xff0c;提升服务端性能。 在数据库前添加…

nohup后台运行,进程查看与终止(ubuntu)

1.nohup用途&#xff1a;不挂断地运行命令。语法&#xff1a;nohup Command [ Arg … ] [ & ]无论是否将 nohup 命令的输出重定向到终端&#xff0c;输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写&#xff0c;输出重定向到 $HOME/nohu…

threejs 学习一

前提 threejs官网&#xff1a;https://threejs.org/ 由于官网访问慢&#xff0c;可以github下载压缩包解压后本地启动 github地址&#xff1a;https://github.com/mrdoob/three.js/ 下载好后解压 安装依赖 npm install 启动&#xff1a;npm start 目录介绍&#xff1a; …

语音识别技术简叙述

语音识别技术简述 语音识别的概念 语音识别技术都是让智能设备能够听懂人类语言&#xff0c;其实一门涉及数学信号处理、人工智能、语言学、数理统计学、声学、情感学及心理学等多学科交叉的学科。这项技术可以提供比如自动客服、自动语音翻译、命令控制&#xff0c;语音验证…

【vue】关于vue2和vue3响应式原理的区别

我们都知道&#xff0c;在Vue2中的数据响应式原理存在许多缺陷。 例如无法对新增和直接删除的数据做到响应式&#xff0c;无法直接操作数组进行响应式处理等等。 而在Vue3中&#xff0c;作者很好的解决了这些缺陷&#xff0c;让我们来对比一下Vue2与Vue3对数据响应式处理的具体…

前端如何保证设置的font-family成功生效?

背景 最近开发的一个新页面&#xff0c;在产品验收的时候跟我反馈说页面里的字体跟设计稿中的字体不一样&#xff1b; 问题的关键是我明明记得我有单独设置过 font-family属性&#xff0c;于是我通过Chorme浏览器的调试工具查看了一下DOM的生效样式&#xff1b; 明明是已经设…

IDEA、TortoiseSVN,TortoiseGit提交忽略文件或文件夹

使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件&#xff1a; 1、IDEA 1、idea设置<<--File Types<<--ignore files and folders 原有的过滤条件&#xff1a;*.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store…

yolov3-tiny的darknet权重转onnx

前言 之前一直鸽了yolov3-tiny的onnx模型修复&#xff0c;今天终于把最后一个bug解决了&#xff0c;如果想直接享受成果的&#xff0c;直接点我的github仓库下载&#xff0c;使用说明都写了&#xff0c;这篇文章呢主要是给大家分享一下思路和过程&#xff0c;希望能够启发更多…

初识Linux

文章目录初识Linux操作系统概述硬件和软件操作系统常见操作系统总结初识LinuxLinux的诞生Linux内核Linux发行版总结虚拟机介绍虚拟机总结远程连接Linux系统图形化、命令行使用命令行学习Linux系统远程连接工具总结初识Linux 操作系统概述 硬件和软件 我们所熟知的计算机是由…

领域驱动设计:微服务设计为什么要选择DDD?

我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;我经常看到项目团队为微服务到底应该拆多小而争得面红耳赤。不同的人会根据自己对微服务的理解而拆分出不同的微服务&#xff0c;于是大家各执一词&#xff0c;谁也说服不了谁&#xff0c;都觉得…