每日算法:全排列问题

给定一个 没有重复 数字的每日序列,返回其所有可能的算法全排列。
示例:
输入: [1,全排2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]本题是回溯算法的经典应用场景
1. 算法策略
回溯算法是一种搜索法,试探法,列问它会在每一步做出选择,每日一旦发现这个选择无法得到期望结果,算法就回溯回去,全排重新做出选择。列问深度优先搜索利用的每日就是回溯算法思想。
2. 适用场景
回溯算法很简单,算法它就是全排不断的尝试,直到拿到解。列问它的每日这种算法思想,使它通常用于解决广度的算法搜索问题,即从一组可能的全排解中,选择一个满足要求的解。
3. 代码实现
我们可以写一下,数组 [1, 2, 3] 的全排列有:
先写以 1 开头的全排列,它们是云服务器提供商:[1, 2, 3], [1, 3, 2],即 1 + [2, 3] 的全排列;
再写以 2 开头的全排列,它们是:[2, 1, 3], [2, 3, 1],即 2 + [1, 3] 的全排列;
最后写以 3 开头的全排列,它们是:[3, 1, 2], [3, 2, 1],即 3 + [1, 2] 的全排列。
即回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期望的解),就回退到上一个岔路口,另选一种走法继续走。源码下载
这显然是一个 递归 结构;
递归的终止条件是:一个排列中的数字已经选够了 ,因此我们需要一个变量来表示当前程序递归到第几层,我们把这个变量叫做 depth ,或者命名为 index ,表示当前要确定的是某个全排列中下标为 index 的那个数是多少; used(object):用于把表示一个数是否被选中,如果这个数字(num)被选择这设置为 used[num] = true ,这样在考虑下一个位置的时候,就能够以 O(1)的时间复杂度判断这个数是否被选择过,这是一种「以空间换时间」的思想。 let permute = function(nums) { // 使用一个数组保存所有可能的全排列 let res = [] if (nums.length === 0) { return res } let used = {}, path = [] dfs(nums, nums.length, 0, path, used, res) return res } let dfs = function(nums, len, depth, path, used, res) { // 所有数都填完了 if (depth === len) { res.push([...path]) return } for (let i = 0; i < len; i++) { if (!used[i]) { // 动态维护数组 path.push(nums[i]) used[i] = true // 继续递归填下一个数 dfs(nums, len, depth + 1, path, used, res) // 撤销操作 used[i] = false path.pop() } } }4. 复杂度分析
时间复杂度:O(n?n!),其中 n 为序列的长度
这是一个排列组合,每层的排列组合数为:Amn=n!/(n?m)! ,故而所有的排列有 :
A1n + A2n + … + An-1n = n!/(n?1)! + n!/(n?2)! + … + n! = n! * (1/(n?1)! + 1/(n?2)! + … + 1) <= n! * (1 + 1/2 + 1/4 + … + 1/2n-1) < 2 * n!
并且每个内部结点循环 n 次,故非叶子结点的b2b信息网时间复杂度为 O(n?n!)
空间复杂度:O(n)leetcode:https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-wen-ti-by-user7746o/
相关文章
如何去掉Word文档中的空白页?(简单有效的方法帮助您轻松处理Word文档中的无用空白页)
摘要:在使用Word处理文档时,我们经常会遇到一些不必要的空白页,这些空白页不仅占用了宝贵的纸张,还影响了文档的整洁度。本文将介绍一些简单有效的方法,帮助您快速去除Word文档中的空白页...2025-11-05
这是我收集的10个很棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Jav2025-11-05
什么是 ABTest产品的改变不是由我们随便「拍脑袋」得出,而是需要由实际的数据驱动,让用户的反馈来指导我们如何更好地改善服务。正如马蜂窝 CEO 陈罡在接受专访时所说:「有些东西是需要 Sense,2025-11-05
2018 年 6 月 4 日,微软宣布收购代码托管平台 GitHub,尽管微软保证会保持 GitHub 的独立性,但这一收购行为还是让 GitHub 社区流失了大量开发者。一年后的今天,微软与开发者的2025-11-05神舟战神K660D-i7D2(探索神舟战神K660D-i7D2的独特之处,解锁极致游戏性能)
摘要:随着科技的进步和游戏的普及,一台性能强悍的游戏电脑成为了许多游戏爱好者的首选。而神舟战神K660D-i7D2作为一款备受瞩目的游戏本,凭借其卓越的性能和独特设计,成为了众多玩家追捧...2025-11-05
在很多需求业务中,都需要浏览器和服务器实时通信来实现功能,比如:扫码登录(扫码后,手机确认登录,PC网页完成登录并跳转)、订单语言提醒等,这些都是建立在两端实时通信的基础上的。对前端而言,来实现浏览器2025-11-05

最新评论