一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
上一题比较tricky,没有用到真正的排列组合算法,由于情况太特殊了,如果换成数字就没法实现了,所以我们还是看一下正常的题目和解法。
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]\
解法:
和上题一样都是全排列,但是变成了一串数字。处理方法和上一题就不一样了,因为字符串插入很简单,但是数组插入的话就会很费时间,所以就不能投机了,这里用最经典的回溯思路来进行数字的全排列。
算法用dfs,用used数组记录当前数字是否选过,然后一直选到不能选为止,记得要恢复状态。(附件有详细图解)
代码:
class Solution {
private:
vector> res;
public:
void dfs(vector& tmp, vector& used, vector& nums){
if(tmp.size()==used.size()){
res.push_back(tmp);
return;
}
for(int i=0; i> permute(vector& nums) {
res.clear();
if(nums.empty()) return res;
vector tmp;
vector used(nums.size(),false);
dfs(tmp,used,nums);
return res;
}
};