📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:没有重复数字的全排列
- 题目链接
- 方法一:递归
- 思路
- 代码
- 复杂度
- 时间复杂度
- 空间复杂度
牛客热题:没有重复数字的全排列
题目链接
没有重复项数字的全排列_牛客题霸_牛客网 (nowcoder.com)
方法一:递归
思路
-
初始化:
permute
函数接受一个整型向量num
,并初始化两个辅助向量:st
用于记录当前元素是否已经被使用,v
用于存储当前排列。num
被排序以确保生成的排列按字典顺序。
-
递归辅助函数
_helper
:_helper
函数通过递归生成排列。- 如果当前排列
v
的大小等于输入向量num
的大小,表示生成了一个完整的排列,将其添加到结果向量res
中。 - 遍历
num
中的每一个元素,如果当前元素未被使用(!st[i]
),将其添加到当前排列v
中,并标记为已使用(st[i] = 1
)。 - 递归调用
_helper
函数生成下一个元素的排列。 - 回溯:从当前排列
v
中移除最后一个元素并将其标记为未使用(st[i] = 0
),以便尝试其他可能的排列。
代码
vector<vector<int>> permute(vector<int>& num)
{vector<vector<int>> res;vector<int> st(num.size(), 0);vector<int> v;sort(num.begin(), num.end());_helper(st, v, num, res);return res;
}void _helper(vector<int>& st, vector<int>& v, vector<int>& num, vector<vector<int>>& res)
{if(v.size() == num.size()){res.push_back(v);return;}for(int i = 0; i < num.size(); ++i){if(!st[i]) {st[i] = 1;v.push_back(num[i]);_helper(st, v, num, res);v.pop_back();st[i] = 0;}}
}
复杂度
时间复杂度
生成排列的总时间复杂度为
O(N * N!)
,其中N
是输入向量num
的大小。
- 对每个排列需要花费
O(N)
的时间来复制排列到结果向量res
中。- 总共有
N!
个不同的排列。空间复杂度
空间复杂度主要由以下几部分组成:
- 递归栈空间:
- 最大递归深度为
N
,因为每次递归调用都将一个新元素添加到当前排列中。- 辅助向量:
st
和v
的空间复杂度为O(N)
。- 结果存储:
res
存储所有的排列,空间复杂度为O(N * N!)
。综合考虑,空间复杂度为
O(N * N!)
,因为结果存储占用的空间是主要部分。