题目链接
LCP 44. 开幕式焰火
代码
法一利用uthash
struct my_struct {
int id;
UT_hash_handle hh;
};
int dfs(struct TreeNode* root, struct my_struct *hash) {
struct my_struct *tmp;
int count = 0;
if (!root) {
return 0;
}
HASH_FIND_INT(hash, &root->val, tmp);
if (!tmp) {
count = 1;
tmp = (struct my_struct *)malloc(sizeof *tmp);
tmp->id = root->val;
HASH_ADD_INT(hash, id, tmp);
}
return count + dfs(root->left, hash) + dfs(root->right, hash);
}
int numColor(struct TreeNode* root){
struct my_struct *hash = NULL;
return dfs(root, hash);
}
- struct my_struct *hash = NULL; 不能为全局,也就是放在函数外面,因为力扣可能会利用for循环调用你写的函数,全局变量会有上一次的信息,所以只能手动用memset清除,当然也得新建一个函数
法二哈希表
int hash[1001];
int dfs(struct TreeNode* root){
int count = 0;
if (!root) {
return 0;
}
if (!hash[root->val]) {
count++;
hash[root->val] = 1;
}
return count + dfs(root->left) + dfs(root->right);
}
int numColor(struct TreeNode* root){
memset(hash,0,sizeof(hash));
return dfs(root);
}
- 还是老问题,如果没有memset只会通过第一个测试用例,第二个测试用例因为hash表里有内容,会导致!hash[root->val]为0,跳过if语句直接返回,最终得到0的错误答案。当然把把数组定义在函数内部也可以,但是新建函数就要多一个参数,为了把数组传入子函数
int dfs(struct TreeNode* root, int hash[]){
int count = 0;
if (!root) {
return 0;
}
if (!hash[root->val]) {
count++;
hash[root->val] = 1;
}
return count + dfs(root->left, hash) + dfs(root->right, hash);
}
int numColor(struct TreeNode* root){
int hash[1001] = {0};
return dfs(root, hash);
}