字符串哈希如果有时间的话就做一下那个字符串匹配问题,还有最长回文子串用(哈希加二分)
并查集!
1.当然一上来就是每日一题了
今天的题目没有做出来
错误代码(dfs)
//深搜和广搜是最基础算法,一定要会!!练。
//一定是最做完后再看题解和评论.
//全局变量下次调用函数时值不会变,因此,普通变量值(像maxlen)不要放在外面,而数组则都要清空
vector<bool>vis;
vector<int>path;
vector<int>res;
void dfs(vector<vector<int>>&arr,int node,int dep,int root)
{
bool flag=0;
int len=arr[node].size();
vis[node]=1;
for(int i=0;i<len;i++)
{
if(vis[arr[node][i]])
{
continue;
}
flag=1;
dfs(arr,arr[node][i],dep+1,root);
}
if(flag==0)
{
cout<<dep<<endl;
path[root]=max(path[root],dep);}
}
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
res.clear();
vis.clear();
path.clear();
path.resize(n,-1);
vector<vector<int>>arr(n);
for(int i=0;i<n-1;i++)
{
arr[edges[i][0]].push_back(edges[i][1]);
arr[edges[i][1]].push_back(edges[i][0]);
}
/* vis.resize(n,0);
dfs(arr,3,0,3);*/
int minlen=9999999;
for(int i=0;i<n;i++)
{
vis.clear();//一定要清空!!
vis.resize(n,0);
dfs(arr,i,0,i);
minlen=min(minlen,path[i]);
}
for(int i=0;i<n;i++)
{
if(path[i]==minlen)
{
res.push_back(i);
}
// cout<<path[i]<<endl;
}
return res;
}
};
正确解法:
树形动规: