当然,还是不想写题解,懒猪儿~有啥要注意的写注释里了,嘿嘿。下了好几天雨,今天出太阳了,心情美丽。今天是2024年11月27日。
46. 全排列
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
// vector<int> visit;
void backtracking(vector<int> nums, int index, vector<int>& visit) {
if (path.size() == nums.size()) {
res.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (visit[i] ==1) continue;
// 这样写是横向纵向是完全树,但是自身不能选,于是想到树的遍历方式,用visit数组来记录,但是刚才出现一个问题,就是我得把visit传参才不会报错
/*在原始代码中,visit数组是在Solution类的成员变量,这意味着它是类的静态成员,而不是每个对象的独立成员。这会导致几个问题:
共享状态:所有Solution对象共享同一个visit数组。这意味着如果你创建了多个Solution对象并调用它们的permute方法,它们都会修改同一个visit数组,这显然不是你想要的行为。
未定义行为:由于backtracking函数试图访问一个它不应该访问的成员变量,这可能导致未定义行为,比如你遇到的运行时错误。*/
path.push_back(nums[i]);
visit[i] = 1;
backtracking(nums, i, visit);
path.pop_back();
visit[i] = 0;
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> visit(nums.size(), 0); // 初始化visit数组
backtracking(nums, 0, visit);
return res;
}
};
47. 全排列Ⅱ
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int> nums,vector<bool> &visit){
if(path.size()==nums.size())
{
res.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(visit[i]==true)
continue;
if(i>0&&visit[i-1]==false&&nums[i]==nums[i-1])
//if(i>0&&visit[i-1]=true&&nums[i]==nums[i-1] true or false 都可以
//if(i>0&&nums[i]==nums[i-1]) 报错
//一定要加上 used[i - 1] == false或者used[i - 1] == true,因为 used[i - 1] 要一直是 true 或者一直是false 才可以,而不是 一会是true 一会又是false。 所以这个条件要写上。
//分析如下:横向分枝时,所有的都是没使用过的,比如【1,2,3】,分成三个枝1,2,3,开启新的枝,全部都是没使用的
// visit[i - 1] == true,说明同一树枝nums[i - 1]使用过
// visit[i - 1] == false,说明同一树层nums[i - 1]使用过
continue;
path.push_back(nums[i]);
visit[i]=true;
backtracking(nums,visit);
path.pop_back();
visit[i]=false;
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> visit(nums.size(),false);
backtracking(nums,visit);
return res;
}
};