image.png

1.自己的尝试 35/37

  1. class Solution {
  2. private:
  3. public:
  4. int gcd(int x ,int y){ //最大公约数
  5. return y == 0 ? x :gcd(y,x%y);
  6. }
  7. int dfs(int i , vector<int> &nums,vector<int> & pre){
  8. int ans = -1;
  9. queue<int> temp;
  10. temp.push(pre[i]);
  11. while(!temp.empty()) {
  12. int x = temp.front();
  13. if(x == -1) break;
  14. if(gcd(nums[i],nums[x]) == 1){
  15. ans = x;
  16. break;
  17. }
  18. else {
  19. temp.push(pre[x]);
  20. temp.pop();
  21. }
  22. }
  23. return ans;
  24. }
  25. vector<int> getCoprimes(vector<int>& nums, vector<vector<int>>& edges) {
  26. int n = nums.size();
  27. vector<int> pre(n,-1);
  28. vector<vector<int>> connect(n,vector<int>{});
  29. for(auto x:edges){
  30. int a = x[0];
  31. int b = x[1];
  32. connect[a].push_back(b);
  33. connect[b].push_back(a);
  34. }
  35. queue<int> temp;
  36. temp.push(0);
  37. unordered_set<int> set;
  38. //遍历每一个节点最近的前缀节点
  39. while(!temp.empty()) {
  40. int x = temp.front();
  41. set.insert(x);
  42. for(int i=0;i<connect[x].size();i++){
  43. if(set.count(connect[x][i])){
  44. continue;
  45. }
  46. else{
  47. temp.push(connect[x][i]);
  48. pre[connect[x][i]] = x;
  49. }
  50. }
  51. temp.pop();
  52. }
  53. vector<int> ans;
  54. for(int i=0;i<n;i++){
  55. int k = dfs(i,nums,pre); //返回每个节点最近的祖先节点
  56. ans.push_back(k);
  57. }
  58. return ans;
  59. }
  60. };

2.题解

其实就是因为每个节点的数值在1到50的范围内,在这种情况下可以枚举1到50的每个数值是否有节点,如果有节点就把它存在一个栈中,这个栈中总是维护一个最深的祖先节点,如果找到了这个level最大的节点,就是当前节点的最近祖先
dfs+回溯

  1. class Solution {
  2. public:
  3. vector<vector<int>> G;
  4. vector<int> res;
  5. stack<pair<int,int>> lasts[55];
  6. void dfs(int node, int pre, int level, vector<int>& a) {
  7. int re = -1, lev = -1;
  8. for(int i = 1; i <= 50; ++i) {
  9. if(lasts[i].size() && lasts[i].top().first > lev && __gcd(i, a[node]) == 1) {
  10. re = lasts[i].top().second;
  11. lev = lasts[i].top().first;
  12. }
  13. }
  14. res[node] = re;
  15. for(int ne : G[node]) {
  16. if(ne != pre) {
  17. lasts[a[node]].push({level, node});
  18. dfs(ne, node, level + 1, a);
  19. lasts[a[node]].pop();
  20. }
  21. }
  22. }
  23. vector<int> getCoprimes(vector<int>& nums, vector<vector<int>>& edges) {
  24. int n = nums.size();
  25. G.resize(n);
  26. for(auto& e : edges) {
  27. G[e[0]].push_back(e[1]);
  28. G[e[1]].push_back(e[0]);
  29. }
  30. res.resize(n);
  31. dfs(0, -1, 0, nums);
  32. return res;
  33. }
  34. };