class Solution {
public:
bool check(TreeNode* a, TreeNode* b){
if(b==NULL) return true;
if(a==NULL||a->val!=b->val) return false;
return check(a->left, b->left)&&check(a->right, b->right);
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A==NULL||B==NULL) return false;
return check(A, B)||isSubStructure(A->left, B)||isSubStructure(A->right, B);
}
};
class Solution {
public:
vector<int> tmp;
vector<vector<int>> ans;
void dfs(int cur, int n, int k){
if(tmp.size()+(n-cur+1)<k) return; //剪枝
if(tmp.size()==k){
ans.push_back(tmp);
return;
}
if(cur==n+1) return; //结束递归
tmp.push_back(cur);
dfs(cur+1, n, k); //选择cur
tmp.pop_back();
dfs(cur+1, n, k); //不选择cur
}
vector<vector<int>> combine(int n, int k) {
dfs(1, n, k);
return ans;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size()==0||matrix[0].size()==0) return {};
vector<int> ans;
int m = matrix.size(), n = matrix[0].size();
vector<vector<bool>> mp(m, vector<bool>(n));
// cout << m << " " << n << endl;
int i = 0, j = 0, op = 0;
while(ans.size()<n*m){
ans.push_back(matrix[i][j]);
mp[i][j] = true;
if(op==0){
if(j+1==n||mp[i][j+1]){
op = 1;
i ++;
}
else j ++;
}
else if(op==1){
if(i+1==m||mp[i+1][j]){
op = 2;
j --;
}
else i ++;
}
else if(op==2){
if(j==0||mp[i][j-1]){
op = 3;
i --;
}
else j --;
}
else{
if(i==0||mp[i-1][j]){
op = 0;
j ++;
}
else i --;
}
}
return ans;
}
};
class Solution {
public:
void dfs(vector<vector<int>>& ans, vector<int>& nums, int bg, int len){
if(bg==len){
ans.push_back(nums);
return;
}
for(int i = bg; i < len; i ++){
swap(nums[i], nums[bg]);
dfs(ans, nums, bg+1, len);
swap(nums[i], nums[bg]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
dfs(ans, nums, 0, nums.size());
return ans;
}
};
class Solution {
public:
vector<int> vis;
void dfs(vector<int>& nums, vector<vector<int>>& ans, int idx, vector<int>& tmp){
if(idx==nums.size()){
ans.push_back(tmp);
return;
}
for(int i = 0; i < nums.size(); i ++){
//跳过重复出现的数
if(vis[i]||(i&&nums[i]==nums[i-1]&&!vis[i-1])) continue;
tmp.push_back(nums[i]);
vis[i] = 1;
dfs(nums, ans, idx+1, tmp);
vis[i] = 0;
tmp.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> tmp;
vis.resize(nums.size());
sort(nums.begin(), nums.end());
dfs(nums, ans, 0, tmp);
return ans;
}
};