Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者丨P.yh

来源丨五分钟学算法

大家好,我是吴师兄,今天分享一道和数学有关的算法题,题目不难,但不优化的话会出现 一顿操作猛如虎,一看击败百分五 的情况:)

题目描述

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

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"

给定 nk,返回第 k 个排列。

说明:

  • 给定 n 的范围是 [1, 9]。

  • 给定 k 的范围是[1,  n!]。

示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"

来源:https://leetcode-cn.com/problems/permutation-sequence

题目解析

一道比较偏数学的题目。

题意是给定 1 ~ n 的数字(n <= 9),因为数字所在的位置不同,这些数字可以组成的整数也不同。最后让你求按照组成的整数大小排序,排在第 k 的整数是多少。

要求全排列的话,时间和空间复杂度都是 O(n!)

先看最直接的解法,通过暴力搜索,找出所有的全排列的情况,然后排序,直接就可以得出答案。

这么做的时间复杂度是 O(n!log(n!))

很显然的是,这么做时间上面不符合要求,需要进一步优化算法。

首先考虑的一个问题是,我们需不需要找出所有的组合情况?

如果要找出所有的情况,那么时间上肯定是没法提高的。这其实就涉及到一个暴力搜索的剪支的问题,就拿 n = 3 为例,按照元素大小,全排列如下:

"123"
"132"
"213"
"231"
"312"
"321"

这里,如果说 k = 5,那么是不是可以说以 “1” 和 “2” 开始的情况我们就不需要考虑了?

我们只需要从 “3” 开始的序列开始找就可以了,这样子可以很大程度上节省搜索的成本。

那么问题来了,如何确定我们需要找的结果在不在以某个数字开头的区间内?

其实,每个数字开头的序列总个数都是一样的,比如上面的以 “1”,“2”,“3” 开头的序列个数都是 2 个,我们只需要逐个排除就行了。

如果 k = 5,因为 5 > 2,说明结果不会在以 “1” 开头的区间中。又因为 5 > 4,说明结果不会在以 “2” 开头的区间中。

但是 5 < 6 的,所以我们需要在开头是 “3” 的序列中继续找。确定了开头数字是 3 之后,我们可以把 3 排除,然后继续去用同样的方法确定第二个数字,第三个数字。。。

这样做下来,时间上面是可以大大提高的。至于具体的时间复杂度是多少,这和具体的输入有关。但是空间方面,我们并不需要 O(n!) 的空间,n 的空间(函数栈空间)就足够了。

参考代码

func getPermutation(n int, k int) string {nums := []int{}for i := 1; i <= n; i++ {nums = append(nums, i)}return helper(nums, k)
}func helper(nums []int, k int) string {totalNums := 1// 计算以每个数字开头的序列个数for i := 1; i < len(nums); i++ {totalNums *= i}for i := range nums {// 以当前数字开头的话,前面的序列的总个数sum := (i + 1) * totalNumssub := k - sum// 说明结果是以当前数字开头// 去掉当前选中的数字,递归去确定接下来的数字if sub <= 0 {arr := []int{}arr = append(arr, nums[:i]...)arr = append(arr, nums[i+1:]...)return strconv.Itoa(nums[i]) + helper(arr, k - i * totalNums)}}return ""
}

程序员专栏 扫码关注填加客服 长按识别下方二维码进群近期精彩内容推荐:   刚刚用鸿蒙跑了个“hello world”! 裸辞1天 vs 裸辞10天 vs 裸辞一个月 分布式id生成策略,我和面试官扯了一个半小时 Python中浅拷贝与深拷贝的骚操作在看点这里好文分享给更多人↓↓

LeetCode 题解:一顿操作猛如虎,一看击败百分五相关推荐

  1. JS逆向寻找生成bid变量的加密算法,一顿操作猛如虎,结果发现原来是混淆代码

    分享一下最近我JS逆向的心得. 我最近使用Python爬取某个网站某个链接,用requests的get发送请求得到的status_code不是200,请求失败.在浏览器的开发者工具里查看该链接的详细信 ...

  2. 一顿操作猛如虎,老罗也要啃老土

    刚得到最新消息,法院冻结锤子450万元,罗永浩的股份被冻结2年. 从 11 月锤子加湿器延迟发货到锤子法人变更,一切不安定的因素正在发酵中.继"锤子付不起员工工资,大幅裁员"传闻后 ...

  3. Linux 常用命令 一顿操作猛如虎

    一顿操作猛如虎 for Ubuntu 先来看下操作系统版本,不一致可能会有不一样的地方.1 cat /proc/version Linux version 4.19.0-1.2.6.265.vca ( ...

  4. mysql sql执行效率_一顿操作猛如虎,SQL执行效率提高250

    原标题:一顿操作猛如虎,SQL执行效率提高250 用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数据70000条 学生成绩表SC: 数据70w条 查询目的: 查 ...

  5. html5 找妹子源码,搞笑GIF趣图:妹子一顿操作猛如虎,然后手中的球全部消失了...

    1.用这种方式去鱼鳞,就一个字"快",而且还非常干净,不过就是比较浪费水,哈哈哈.这还是比较适合卖鱼的档口使用,还能当做才艺表演来招揽生意. 2.大马路中间竟然开起车展来,这舞台大 ...

  6. android 启动页_App启动优化一顿操作猛如虎

    前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...

  7. 启动白屏处理_App启动优化一顿操作猛如虎

    前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...

  8. App启动优化-一顿操作猛如虎

    前言 ++一个应用App的启动速度能够影响用户的首次体验,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在应用商店针对您的应 ...

  9. 整活插件 炉石传说_炉石传说:一顿操作猛如虎,定睛一看原地杵,会长整活被死人抬走...

    玩游戏找热点,点击关注不迷路 在酒馆战棋中,要说当下最强的一套吃鸡体系,那肯定是整活流了.这套体系也是玩家们经过了长久的摸索逐渐形成了一套完整的流派.这套流派的最大优势就是一旦整活成功,可以说吃鸡相当 ...

最新文章

  1. python游戏贪吃蛇_Python写的贪吃蛇游戏例子_python
  2. wxWidgets:窗口 ID
  3. 成功人士都是这样逼出来的
  4. 例子---年倒计时/JS日期对象类型
  5. 测试开发必备技能-Jmeter二次开发
  6. [ 深度学习 ] —— 图卷积神经网络 GCN
  7. 永磁同步电机转子磁链_永磁同步电机转子初始位置检测、增量式光电编码器对位调零思路解析...
  8. SQL Server 2000 Service Pack 4 is released
  9. 初二生态系统思维导图_初中生物生态系统知识点思维导图
  10. c语言代码大全表解释_C语言解惑圈子更新(20191201)
  11. 88家上市公司区块链分布图:七成拓展落地应用 互联网公司善于底层基础
  12. 记一次失败的阿里巴巴电话面试
  13. 《一封来自日本的信——2018年日本社会和生活水平现状》 摘要
  14. 【有利可图网】不懂ps排版?超详细排版教程送上!
  15. Fastqc安装运行(jdk安装)
  16. 宝塔php漏洞,宝塔面板 phpmyadmin 未授权访问漏洞 BUG ip:888/pma的问题分析
  17. 常见的测试用例设计方法7---因果图法
  18. bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树
  19. 马云:大数据时代,最重要的是做最好的自己
  20. RGB YUV [转]

热门文章

  1. 三星980处理器和骁龙855_手机处理器最新排名:麒麟980因一缺陷,不敌高通骁龙855...
  2. Linux多线程学习 - sched_yield() CPU让权
  3. 每日一算法:冒泡排序
  4. Python入门学习——DAY01
  5. JAVA超全笔试/面试考试题.(500问)--第三章面试题全面收录
  6. Android 2.3应用开发实战
  7. 计算机到交换机端口查询,新手上路:根据ip地址查交换机端口网络知识 -电脑资料...
  8. CameraView Android 相机预览控件
  9. idea创建父子工程module_在IDEA中创建父工程和子模块module的方法步骤
  10. unity使用tiled文件,将数据用unity打开,可以无限tiled地图