class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for (int i = 0; i != n; ++i) {
nums1[m + i] = nums2[i];
}
sort(nums1.begin(), nums1.end());
}
};
class Solution1 {
public:
vector<int> grayCode(int n) {
vector<int> res;
res.push_back(0);
unordered_set<int> st;
st.insert(0);
int N = pow(2, n);
dfs(n, N, res, st);
return res;
}
private:
bool dfs(int n, int N, vector<int>& res, unordered_set<int>& st) {
if (res.size() == N) {
return true;
}
auto last = res.back();
for (int i = 0; i < n; i++) {
auto next = last;
next ^= (0x1 << i);
if (st.count(next)) {
continue;
}
res.push_back(next);
st.insert(next);
if (dfs(n, N, res, st)) {
return true;
}
res.pop_back();
st.erase(next);
}
return false;
}
};
// Binary code to gray code has a conversion formula
class Solution2 {
public:
vector<int> grayCode(int n) {
vector<int> res;
int N = pow(2, n);
for (int i = 0; i < N; i++) {
res.push_back((i >> 1) ^ i);
}
return res;
}
};
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
queue<TreeNode*> Q;
Q.push(root);
int ans = 0;
while (!Q.empty()) {
int sz = Q.size();
while (sz > 0) {
TreeNode* node = Q.front();Q.pop();
if (node->left) Q.push(node->left);
if (node->right) Q.push(node->right);
sz -= 1;
}
ans += 1;
}
return ans;
}
};