两棵树

两棵树的问题

http://www.nowcoder.com/questionTerminal/ae592e8b25f041b28dbc27b986441085

这题我超时了,思路应该 是对滴,本地用例通过了。

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param a int整型一维数组 
     * @param aLen int a数组长度
     * @param b int整型一维数组 
     * @param bLen int b数组长度
     * @param c int整型一维数组 
     * @param cLen int c数组长度
     * @return int整型
     */
    //在树中找到每个节点的路径,对路径进行比较
   int findLength(int first, int second, int* a, int aLen) {
         int tmp = first;
         if (first == 0)
                return 0;
       //存储节点1的路径
        std::vector<int> dp;
        while (first != 0) {
        if (a[first] != 0 && a[first] != second)
        {
            first = a[first];
            dp.push_back(first);

        }
        else {
                if (a[first] == second)
                    return 0;
                else
                    if (a[first] == 0)
                        break;
            }
        }
        dp.push_back(0);
       //存储节点2的路径
        std::vector<int> dp1;
        while (second != 0) {
            if (a[second] != 0 && a[second] != tmp) {
                second = a[second];
                dp1.push_back(second);
            }
            else {
                if (a[second] == tmp)
                    return 0;
                else
                if (a[second] == 0)
                    break;
            }
        }
        dp1.push_back(0);
       //计算公共节点的深度
        int result = -1;
        int start = dp.size() - 1;
        int start1 = dp1.size() - 1;
        while (start >= 0 && start1 >= 0&&dp[start] == dp1[start1]) {
            result += 1;
            start -= 1;
            start1 -= 1;
           }
        return result;
    }
    int wwork(int n, int* a, int aLen, int* b, int bLen, int* c, int cLen) {
        // write code here
        //a数组是用来对b数组编号进行映射,可以在c中找到对应的编号。
        // b中为2 3编号的节点,对应a的编号为a[2]=1,a[3]=3,也就是说在c中找到这两个编号即
        //c[1],c[3]
        //超时了,你们可以优化下,我本地通过。
        int result = 0;
        for(int i=1;i<n;++i){
            for(int j=i+1;j<=n;++j){
                int tmp = findLength(i,j,b,bLen);
                int first = a[i];
                int second = a[j];
                tmp += findLength(first,second,c,cLen);
                if(tmp>result)
                    result = tmp;
            }
        }
        return result;
    }
};
全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务