LeetCode55 - 全排列
📝 题目描述
题目链接:全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例:
1 | 示例 1: |
提示:
1 <= nums.length <= 6-10 <= nums[i] <= 10nums 中的所有整数 互不相同
💡 解题思路
方法一:回溯
把数组里的数字想象成放在桌子上的小球,我们要把它们依次放进一个个格子里。每次挑小球时,看看哪个还没被挑走,就把它放进格子里,然后继续挑下一个。
步骤:
- 状态记录:使用了
used布尔数组来记录哪些数字已经被选过了,用一个track来记录当前已经选好的数字序列。 - 递归填数:在每一层递归中,从头到尾遍历整个
nums数组。 - 剪枝与选择:如果发现
nums[i]对应的used[i]为true,说明这个数字在当前排列中已经用过了,直接跳过(continue)。否则,把它加入track,标记为已使用(used[i] = true),然后进入下一层递归。 - 撤销操作(回溯):当递归返回后,把刚才加进去的数字拿出来(
track.pop_back()),并且解除它的使用标记(used[i] = false),这样它就可以在后续的排列中再次被使用。
经过上面的过程,我们就可以得到全排列的结果。
🔧 代码实现
1、回溯
1 | class Solution { |
📊 复杂度分析
1、回溯
- 时间复杂度:,N! 是全排列的个数,每个排列复制到结果数组中需要 的时间。
- 空间复杂度:,除了 的递归调用栈,还需要额外的 空间用于
used数组和track路径。
🎯 总结
- 核心思想:掌握回溯法模板。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 很多时候不懂事!