📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

文章目录
- 牛客热题:没有重复数字的全排列
- 题目链接
- 方法一:递归
- 思路
- 代码
- 复杂度
- 时间复杂度
- 空间复杂度
牛客热题:没有重复数字的全排列
题目链接
没有重复项数字的全排列_牛客题霸_牛客网 (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!),因为结果存储占用的空间是主要部分。