剑指 Offer II 118. 多余的边-记忆搜索深度优先遍历

剑指 Offer II 118. 多余的边

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。

示例 1:
在这里插入图片描述

输入: edges = [[1,2],[1,3],[2,3]]
输出: [2,3]

示例 2:
在这里插入图片描述

输入: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
输出: [1,4]

解题代码如下,需要维护一个最大下标:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int find;
 int indexz;
 void judge(int** edges, int edgesSize,int now_node,int start,int *r){
     if(find==0){
       
         for(int i=0;i<edgesSize;i++){
             if(edges[i][0]==now_node&&r[i]==0){
               
                 if(edges[i][1]==start){
                       indexz=fmax(indexz,i);
                     find=1;
                 }
                 if(find==0){
                     r[i]=1;
                    judge(edges,edgesSize,edges[i][1],start,r);
                     r[i]=0;
                
                      if(find==1){
                          indexz=fmax(indexz,i);
                     }

                 }
             }
             if(edges[i][1]==now_node&&r[i]==0){
                  
                 if(edges[i][0]==start){
                       indexz=fmax(indexz,i);
                     find=1;
                 }
                 if(find==0){
                      r[i]=1;
                     judge(edges,edgesSize,edges[i][0],start,r);
                      r[i]=0;
                     if(find==1){
                          indexz=fmax(indexz,i);
                     }

                 }
             }
             



         }



     }
 }

 
int* findRedundantConnection(int** edges, int edgesSize, int* edgesColSize, int* returnSize){
    find=0;
    int find_node=-1;
    int *re=(int *)malloc(sizeof(int)*2);
    int *r=(int *)malloc(sizeof(int)*edgesSize);
  
    int p;
     for(int i=0;i<edgesSize;i++){
         r[i]=0;

     }
    for(int i=1;i<=edgesSize;i++){
      indexz=-1;
        judge(edges,edgesSize,i,i,r);
       
        if(find==1){
            p=indexz;
            
            find_node=i;
            break;

        }

    }
 
    if(find_node==-1){

        *returnSize=0;
        return re;

    }
    else{
        re[0]=edges[p][0];
        re[1]=edges[p][1];
          *returnSize=2;
        return re;
    }
    


}











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值