LeetCode 题解:一顿操作猛如虎,一看击败百分五
Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者丨P.yh
来源丨五分钟学算法
大家好,我是吴师兄,今天分享一道和数学有关的算法题,题目不难,但不优化的话会出现 一顿操作猛如虎,一看击败百分五 的情况:)
题目描述
给出集合 [1,2,3,…,n]
,其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 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 题解:一顿操作猛如虎,一看击败百分五相关推荐
- JS逆向寻找生成bid变量的加密算法,一顿操作猛如虎,结果发现原来是混淆代码
分享一下最近我JS逆向的心得. 我最近使用Python爬取某个网站某个链接,用requests的get发送请求得到的status_code不是200,请求失败.在浏览器的开发者工具里查看该链接的详细信 ...
- 一顿操作猛如虎,老罗也要啃老土
刚得到最新消息,法院冻结锤子450万元,罗永浩的股份被冻结2年. 从 11 月锤子加湿器延迟发货到锤子法人变更,一切不安定的因素正在发酵中.继"锤子付不起员工工资,大幅裁员"传闻后 ...
- Linux 常用命令 一顿操作猛如虎
一顿操作猛如虎 for Ubuntu 先来看下操作系统版本,不一致可能会有不一样的地方.1 cat /proc/version Linux version 4.19.0-1.2.6.265.vca ( ...
- mysql sql执行效率_一顿操作猛如虎,SQL执行效率提高250
原标题:一顿操作猛如虎,SQL执行效率提高250 用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数据70000条 学生成绩表SC: 数据70w条 查询目的: 查 ...
- html5 找妹子源码,搞笑GIF趣图:妹子一顿操作猛如虎,然后手中的球全部消失了...
1.用这种方式去鱼鳞,就一个字"快",而且还非常干净,不过就是比较浪费水,哈哈哈.这还是比较适合卖鱼的档口使用,还能当做才艺表演来招揽生意. 2.大马路中间竟然开起车展来,这舞台大 ...
- android 启动页_App启动优化一顿操作猛如虎
前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...
- 启动白屏处理_App启动优化一顿操作猛如虎
前言 本次主要内容包括: 针对App启动优化我们做了哪些工作? 1.App启动优化方向:视觉体验优化 2.App启动优化方向:代码逻辑优化 一.App启动优化方向:视觉体验优化 App启动时白屏问题 ...
- App启动优化-一顿操作猛如虎
前言 ++一个应用App的启动速度能够影响用户的首次体验,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在应用商店针对您的应 ...
- 整活插件 炉石传说_炉石传说:一顿操作猛如虎,定睛一看原地杵,会长整活被死人抬走...
玩游戏找热点,点击关注不迷路 在酒馆战棋中,要说当下最强的一套吃鸡体系,那肯定是整活流了.这套体系也是玩家们经过了长久的摸索逐渐形成了一套完整的流派.这套流派的最大优势就是一旦整活成功,可以说吃鸡相当 ...
最新文章
- python游戏贪吃蛇_Python写的贪吃蛇游戏例子_python
- wxWidgets:窗口 ID
- 成功人士都是这样逼出来的
- 例子---年倒计时/JS日期对象类型
- 测试开发必备技能-Jmeter二次开发
- [ 深度学习 ] —— 图卷积神经网络 GCN
- 永磁同步电机转子磁链_永磁同步电机转子初始位置检测、增量式光电编码器对位调零思路解析...
- SQL Server 2000 Service Pack 4 is released
- 初二生态系统思维导图_初中生物生态系统知识点思维导图
- c语言代码大全表解释_C语言解惑圈子更新(20191201)
- 88家上市公司区块链分布图:七成拓展落地应用 互联网公司善于底层基础
- 记一次失败的阿里巴巴电话面试
- 《一封来自日本的信——2018年日本社会和生活水平现状》 摘要
- 【有利可图网】不懂ps排版?超详细排版教程送上!
- Fastqc安装运行(jdk安装)
- 宝塔php漏洞,宝塔面板 phpmyadmin 未授权访问漏洞 BUG ip:888/pma的问题分析
- 常见的测试用例设计方法7---因果图法
- bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树
- 马云:大数据时代,最重要的是做最好的自己
- RGB YUV [转]
热门文章
- 三星980处理器和骁龙855_手机处理器最新排名:麒麟980因一缺陷,不敌高通骁龙855...
- Linux多线程学习 - sched_yield() CPU让权
- 每日一算法:冒泡排序
- Python入门学习——DAY01
- JAVA超全笔试/面试考试题.(500问)--第三章面试题全面收录
- Android 2.3应用开发实战
- 计算机到交换机端口查询,新手上路:根据ip地址查交换机端口网络知识 -电脑资料...
- CameraView Android 相机预览控件
- idea创建父子工程module_在IDEA中创建父工程和子模块module的方法步骤
- unity使用tiled文件,将数据用unity打开,可以无限tiled地图